2012-09-04 9 views
14

私は元々オフトラックだったが、問題を解決することができなくなったことを知ったこの質問を完全に再構成しています。この画像を参照しながら... storyboard illustration複数のUIViewControllersの間で1つのストーリーボードシーンを共有する方法

I(赤で強調表示マスタービューがMFMasterViewControllerのサブクラスの数のいずれかであるようなコードでは(黄色で強調)セグエを作成または操作するか欠けてい)。

ニブを使用してこれを行うとき、私はペン先を作成することができ、SharedNib.xib &は、MFMasterViewControllerとしてクラスを設定し、その後、私のサブクラスを作成し、MFMasterViewControllerSubclassAを言う、MFMasterViewControllerSubclassBなど&は、私が使用して欲しかった方のサブクラスのインスタンス...

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

か...

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

など

ストーリーボードを使ってこの権利を得る方法に関する手がかりは?

私の場合、これを行う理由は、すべてのサブクラスが同じテーブルビュー&のデータですが、セルの詳細テキストに書き込まれる内容に若干の違いがあることが別の方法でソートされています(&)。私はそれが珍しいパターンではないと思う。あなたの.mファイルがどのストーリーボードに関連付けられていない場合

乾杯& TIA、 ペドロ:)

+0

私は、私のストーリーボードにすべてのサブクラスのシーンのコピーを作成することでこれを行うことができると認識していますが、シーンがまったく同じですべてのバージョンが同じ次のシーン。 – Pedro

+0

ストーリーボードのコントローラーはクラス 'MyViewController'に割り当てられ、 'MyViewControllerSubclass'は' MyViewController'のサブクラスです –

+0

両方の質問にはいはい: – Pedro

答えて

5

これは直接的な回答ではありませんが、これは理由の説明に基づいて希望するものを達成する方法です。

MFMasterViewControllerからUITableViewDataSource(と多分デリゲートも)を分離する必要があります。そのため、segueが実行されると、正しいデータソースを設定してビューコントローラに委譲することができます。

ナビゲーションコントローラでは、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]; 
    } 
} 

あなたのビューコントローラのサブクラスを作成することなく、必要なカスタマイズを取得することができますこの方法です。

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

1

、self.storyboardナシのではないでしょうか?

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

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

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"]; 
+0

私の例で私がMyViewControllerと呼んだクラスは、私のストーリーボードのシーンと質問の仕事の最初の2つのコード例に属しています。 MyViewControllerSubclassはMyViewControllerのサブクラスですが、それを呼び出すコードは失敗します。 – Pedro

+0

- (id)initWithIdentifier:(NSString *)識別子のソース:(UIViewController *)ソースの宛先:(UIViewController *)宛先{ UIStoryboard * storyBoard = [UIStoryboard storyboardWithName:@ "MainStoryboard_iPhone" bundle:なし]; UIViewController * viewController = [storyBoard instantiateViewControllerWithIdentifier:@ "testIdentifier"]; // MyViewController * viewController = [[MyViewController alloc] initWithNibName:@ "MyViewController"バンドル:nil]; 戻り値[スーパーinitWithIdentifier:識別子ソース:ソース宛先:viewController]; } – prashant

3

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

1

私は結局答えを見つけたと信じています。私たちは、別のクラス名でストーリーボードViewControllerを使いたいと思っています。代理人のような多くの回避策がありますが、これが最善の策だと思います。私は既に別の話題で答えました。それが役に立てば幸い! https://stackoverflow.com/a/32103618/1943053

関連する問題