15

私は元々軌道に乗っていなかったが、問題の解決に近づくことができないことを知って、この質問を完全に再定式化しています。この画像を参考に... 絵コンテイラスト

マスタービューが(赤で強調表示されている)のいくつかのサブクラスのいずれかになるように、コードでセグエ(黄色で強調表示されている)を作成または操作したいと考えていますMFMasterViewController

Nibsを使用してこれを行う場合、Nibを作成しSharedNib.xib、クラスをに設定してMFMasterViewControllerから、サブクラスを作成します。たとえばMFMasterViewControllerSubclassAMFMasterViewControllerSubclassB使用したいサブクラスをインスタンス化します...

MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil];

また...

MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil];

ストーリーボードを使用してこれを正しく行う方法についての手がかりはありますか?

私の場合、これを実行したい理由は、すべてのサブクラスが同じテーブルビューとデータであるが、並べ替えが異なり、セルの詳細テキストに書き込まれる内容に多少の違いがあるためです。それは珍しいパターンではないと思います。

Cheers&TIA、Pedro :)

4

4 に答える 4

5

直接的な答えではありませんが、理由の説明に基づいて、私があなたが望むことを達成する方法です。

UITableViewDataSource基本的に、 (そしておそらくデリゲートも)から分離する必要があるMFMasterViewControllerので、セグエが実行されるときに、ViewControllerで正しいdataSourceとデリゲートを設定できます。

したがって、Navigation Controllerで、メソッドを実装する必要がありますprepareForSegue:sender:。ここで、実行する前にセグエをカスタマイズできます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // you can set the segue identifier using Interface Builder 
    // also it is a good thing to make sure which segue you're using
    if (([segue identifier] isEqualToString:@"TheId"]) {
       id<UITableViewDataSource> dataSource = [[TableViewDataSourceImplementationA alloc] init];
       [[[segue destinationViewController] tableView] setDataSource:dataSource];
    }
}

このようにして、View Controllerのサブクラスを作成しなくても、必要なカスタマイズを行うことができます。

また、WWDCビデオにアクセスできる場合は、セッション#407「アプリでストーリーボードを採用する」を確認してください。

于 2012-09-11T21:01:27.367 に答える
3

この質問に出くわした人は、コントローラーをサブクラス化する代わりに、より一般的に「戦略」パターンを使用することも検討する必要があります。受け入れられた答えは、実装された戦略がデータソース/デリゲートが何であれ、実行時に切り替えることができるという形です。これの別の例はhttps://stackoverflow.com/a/17381927/954643です

于 2013-12-17T20:20:23.207 に答える
1

.m ファイルがどのストーリーボードにも関連付けられていない場合、self.storyboard は Nil ではないでしょうか?

  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
                                   @"MainStoryboard" bundle:[NSBundle mainBundle]];
    ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"];

storyboardWithName: をストーリーボードの名前に変更してください。

NSString * storyBoardName;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    storyBoardName = @"MainStoryboard_iPad";
} else {
    storyBoardName = @"MainStoryboard_iPhone";
}
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:
                                   storyBoardName bundle:[NSBundle mainBundle]];
ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"];
于 2012-09-04T18:05:14.397 に答える