7

UISplitViewControllerとストーリーボードを使用してiPadアプリを組み立てようとしています。マスタービューは、6つのメニューオプションのテーブルビューにリンクされたナビゲーションコントローラーから始まります。テーブル内の各セルは、異なるテーブルビューコントローラーをナビゲーションスタックにプッシュします。これは、マスタービューでは正常に機能しています。各マスタービューにはテーブルリストがあり、クリックすると詳細ペインに異なるビューコントローラーを表示する必要があります。私は現在、セグエを「置換」と「詳細分割」に設定してこれを行っています。これは、行が最初にクリックされたときに機能しますが、マスタービューで別の行をクリックするか、デバイスを回転するとすぐにアプリがクラッシュしますEXC_BAD_ACCESSを使用します。

私の問題は、UISplitViewControllerのデリゲートの設定方法に関係していると確信しています。複数のマスターVCと複数の詳細VCがある場合に、これをどのように使用するかについて混乱しています。デリゲートコードはどこに配置する必要がありますか?マスターまたは詳細?すべてのViewControllerにUISplitViewControllerDelegateプロトコルイベントを実装する必要がありますか?

助けていただければ幸いです。

4

1 に答える 1

16

分割ビューコントローラーデリゲートが交換された詳細ビューコントローラーであった場合、これがクラッシュの原因です。置き換えられた詳細ビューコントローラは割り当て解除されているため、分割ビューコントローラデリゲートは有効なオブジェクトへの参照ではなくなりました。

prepareForSegue:sender:でデリゲートを更新できます。例えば:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"MySegue"]) {
        UIViewController *destinationViewController = [segue destinationViewController];
        if ([destinationViewController conformsToProtocol:@protocol(UISplitViewControllerDelegate)]) {
            self.splitViewController.delegate = destinationViewController;
        }
        else {
            self.splitViewController.delegate = nil;
        }
    }
}

デリゲートに使用するViewControllerは、ViewControllerの階層によって異なります。最も単純なケースでは、splitVC詳細に割り当てられているViewControllerはおそらくデリゲートである必要があります。これらはすべて、共有スプリットビューコントローラーデリゲートロジックを処理する共通のスーパークラスに基づいて作成することをお勧めします。

于 2012-05-14T04:10:19.197 に答える