質問

確かに無害に見えます。私のアプリデリゲートで、私はチェックします NSUserDefaults 起動時にヒントを表示するためのフラグ。設定されている場合は、最後に applicationDidFinishLaunching:, 、 私はこれをします:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

このビューを一時的に表示することが目的です。(モーダル VC ではないことに注意してください。この時点ではナビゲーション コントローラーがなく、さらにこのビューにはナビゲーション バーもありません)。

このビューが却下されたら、プリエンプトを追加します。 UITabBarControllerのビューをウィンドウに移動してそこに遷移し、メイン ウィンドウからヒント ビューを削除します。まだビューを終了するポイントに到達していないので、読み続けてください。

私の TipsView の VC は、多かれ少なかれ次のように接続されています。

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

ソースには 3 つすべての宣言と定義が含まれています。 IBアクション 呼び出します。今のところ2人は何もしていない。3番目はチップを変更します text, に合わせてサイズを変更し、スクロール ビューを調整します。 contentSize 合わせる。

アプリを実行すると、 ヒントビューコントローラー ビューは問題なく表示されます。ヒントのテキストをスクロールすることもできます。ただし、いずれかのタッチアップインサイドをトリガーすると、 UIボタン, Xcode が私をソースに埋め込み始めます (各ソースにブレークポイントを配置しました) IBアクション) …そして、次のいずれかの方法でベイルアウトします。 EXC_BAD_ACCESS または obj_stack_overflow.

これを、VC、ビュー、ボタンがあるアプリの他の部分と比較してみました。この場合、次の点を除いて、すべての点で同一です。 VC をナビゲーション コントローラーにプッシュするのではなく、アプリのウィンドウのサブビューとして VC のビューを追加しました。. 。さらに、 iPhone OS 用コントローラ プログラミング ガイドを表示 ドキュメントによると、これは公平なゲームです。

アプリケーションでシングルビューコントローラーを使用する場合、ビューコントローラーをタブバーまたはナビゲーションコントローラーに追加する代わりに、ウィンドウにビューを追加します。

本当です、私は する 持っています UITabBarController 翼で待っています、そしてそれはタブを持っています UINavigationController (そして他のVCも)その中にいます。ただし、ヒント ビューが表示されている場合、タブ バー コントローラーのビューには ない まだウィンドウに追加されていません。目的は、ヒントの表示が終了した後に交換することです。言い換えれば、どう考えても、私たちは一時的に 1 つの VC をプレイしているかのように振る舞っているのです。その後、タブバーに切り替えて先端のVCを解体します。

おそらく私は何か微妙に間違ったことをしているでしょうか?もっと良い方法はありますか?(「もっと良い方法があるはずだ!」)

スタック トレースのサンプル:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

トレースからわかるように、最終的には次の場所に到着します。 doesNotRecognizeSelector: …ただし、私のヒント VC ソースでメソッドがはっきりと確認できます。さらに、それらはすべて接続されています。(IB では多重配線などはありません。ファイルの所有者の関係に至るまで、すべてがうまくいっているように見えます。)

手がかりを歓迎/感謝します!

役に立ちましたか?

解決

問題は最初のコード スニペットにあります。TipsViewController のインスタンスを作成し、そのビューを保持してからビュー コントローラーを解放すると、割り当てが解除されます。それで今、 target ボタンのポインタは、割り当てが解除されたビュー コントローラへのポインタです。

ビューはビュー コントローラーを保持せず、デリゲートやターゲットも保持しません。

ビュー コントローラー インスタンスを保持しておく必要があります (おそらく、 retain プロパティ - ビューを表示したい限り。ビューの使用が完了したら、そのビューを親ビューから削除し、ビュー コントローラーを解放できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top