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

时间:2012-09-04 17:54:45

标签: ios uiviewcontroller segue uistoryboard uistoryboardsegue

我完全重新制定了这个问题,因为我知道我原本偏离轨道但是让我无法解决问题。参考这张图片...... storyboard illustration

我想在代码中创建或操作segue(以黄色突出显示),以便主视图是MFMasterViewController的多个子类中的任何一个(以红色突出显示)。

当使用Nibs执行此操作时,我可以创建一个Nib,SharedNib.xib&将类设置为MFMasterViewController,然后创建我的子类,比如MFMasterViewControllerSubclassAMFMasterViewControllerSubclassB等。&然后实例化我想要使用的子类......

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

...或

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

关于如何使用故事板来解决这个问题的任何线索?

在我的情况下,想要这样做的原因是我的所有子类都是相同的tableview&数据但排序不同&对于写入细胞的细节文本有什么不同。我怀疑这是一种并不罕见的模式。

干杯& TIA, 佩德罗:)

4 个答案:

答案 0 :(得分:5)

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

基本上你需要将UITableViewDataSource(也可能是委托)与MFMasterViewController分开,所以当执行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];
    }
}

通过这种方式,您可以获得所需的自定义,而无需创建视图控制器的子类。

如果您可以访问WWDC视频,请查看会话#407在您的应用中采用故事板。

答案 1 :(得分:3)

对于任何绊倒这个问题的人,您还应该考虑更一般地使用“策略”模式作为子类化控制器的替代方案。接受的答案是一种形式,其中实现的策略来自数据源/委托的任何内容,并且可以在运行时切换出来。另一个例子是https://stackoverflow.com/a/17381927/954643

答案 2 :(得分: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"];

答案 3 :(得分:1)

我相信我终于找到了答案。我们想要将storyboard ViewController与另一个类名一起使用。有许多变通方法,比如使用代理,但我认为这是最好的。我已经在另一个主题中回答了它。希望能帮助到你! https://stackoverflow.com/a/32103618/1943053