0

Facebook のようなサイド メニューを作成するために、UIViewControllerメニューの上にUIViewControllerボードをスタックしたいと考えています。このメニューには UITextView が含まれている必要があります。

これまでのところ、ボード ビューを横にドラッグすると、その下にメニューが表示されます。偉大な。しかし、メニュー内の UITextView には問題があります。クリックすると、アプリが BAD_EXC... 例外でクラッシュします。UITextView デリゲートの問題のようです。

現在、私が設定している方法は次のとおりです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    //Board
    board = [[BoardViewController alloc] init];
    [self.window setRootViewController:board];

    //Menu
    MenuViewController* menu = [[MenuViewController alloc]init];
    menu.textView.delegate = menu;
    [self.window addSubview:menu.view];

    //Window
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

注:textViewデリゲートをボードに設定してデリゲートメソッドを実装すると機能しますが、メニューのテキストビューメソッドを実装するのは本当に間違っているようです。メニューのデリゲートは、メニュー クラス自体にある必要があります。

メニューのtextViewデリゲートをメニュークラスに正しく設定するには?

4

2 に答える 2

2
//Menu
MenuViewController* menu = [[MenuViewController alloc]init];
menu.textView.delegate = menu;
[self.window addSubview:menu.view];

そして、poof:メニュービューコントローラは再度参照されず、ARCによって割り当てが解除されます。ビューはウィンドウによって保持されるため、テキストビューが割り当て解除されてから長い時間が経過したオブジェクトにデリゲートメッセージを送信しようとするまで、すべてが正常であるように見えます。EXC_BAD_ACCESSこれがクラッシュの原因です。

単純で緩い解決策は、メニュービューコントローラーのアプリデリゲートでプロパティを定義することです。

@property (nonatomic, strong) MenuViewController * menu;

メニューをそこに保存します

//MenuViewController* menu = [[MenuViewController alloc]init];
//becomes
self.menu = [[MenuViewController alloc]init];

適切な解決策と私が推奨する解決策は、UIViewControllerの包含を検索し、この特別なビューコントローラーの配置を管理する独自のカスタムビューコントローラーコンテナーを実装することです。

簡単に説明するとUIViewController、2つのプロパティを持つサブクラスがあります。1つはボードビューコントローラー用で、もう1つはメニュービューコントローラー用です。それはスクロールビューを持ち、スライドアクションとボードからメニューへ、またはその逆に渡される必要のあるすべての通信を担当します。このコンテナは、ボードとメニュービューコントローラをロードし、それらのビューを独自のビューの正しい場所に挿入する役割も果たします。ボードビューコントローラーを別のボードに交換する必要がある場合は、コンテナーがこれも担当します。

于 2013-01-13T14:11:33.813 に答える
0

通常は、インターフェイス ビルダーでデリゲート接続を textField からビュー コントローラーにドラッグするか、メニュー ビュー コントローラーの viewDidLoad でプログラムによって設定します。アプリのデリゲートがこのプロセスとは何の関係もないという点で、あなたは正しいです。

于 2013-01-13T14:02:35.880 に答える