如何在多个UIViewControllers之间共享一个故事板场景

我完全重新制定了这个问题,得知我本来是偏离了轨道,但是我没有接近解决问题。 参照这个图像… 故事板的插图

我想要在代码中创build或操作segue(以黄色突出显示),这样Master视图就是MFMasterViewController的多个子类中的任何一个(以红色突出显示)。

当使用Nibs这样做时,我可以创build一个Nib, SharedNib.xib并将该类设置为MFMasterViewController ,然后创build我的子类,比如说MFMasterViewControllerSubclassAMFMasterViewControllerSubclassB等等,然后实例化任何我想使用的子类。

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

要么…

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

等等

任何线索,如何我可以使用故事板得到这个权利?

在我的情况下,想要做到这一点的原因是,我所有的子类是相同的tableview和数据,但sorting不同,并在写入到cels的细节文本的东西有一些不同。 我怀疑这是一个不常见的模式。

干杯和TIA,佩德罗:)

这不是一个直接的答案,但这是我如何根据你对原因的解释完成你想要的。

基本上你需要从MFMasterViewController分离出UITableViewDataSource (也可能是委托),所以当执行segue时,你可以在视图控制器中设置正确的dataSource和delegate。

所以在导航控制器中,你需要实现prepareForSegue:sender:方法。 这是您可以在执行之前自定义segue的地方:

 - (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]; } } 

这样你可以得到你想要的定制而不需要创build视图控制器的子类。

如果您有权访问WWDCvideo,请检查会话#407在应用程序中采用情节串联图板。

对于任何人都在这个问题上磕磕绊绊,你还应该更一般地考虑使用“策略”模式作为子类化控制器的替代scheme。 被接受的答案就是这样一种forms,即所实施的策略来自任何数据源/代表,并且可以在运行时切换出来。 另一个例子是https://stackoverflow.com/a/17381927/954643

如果.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"]; 

我相信我终于find了答案。 我们想用另一个类名称来使用Storyboard ViewController。 有很多解决方法,如使用代表,但我认为这是最好的。 我已经在另一个话题上回答了。 希望能帮助到你! https://stackoverflow.com/a/32103618/1943053