15

我完全重新制定了这个问题,因为我了解到我最初偏离了轨道,但让我离解决问题更近了一步。参考这张图... 故事板插图

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

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

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

或者...

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

等等

关于我如何使用情节提要来做到这一点的任何线索?

在我的情况下,想要这样做的原因是我的所有子类都是相同的表格视图和数据,但排序不同,并且在写入 cels 的详细文本的内容方面存在一些差异。我怀疑这是一种并不少见的模式。

干杯和 TIA,佩德罗 :)

4

4 回答 4

5

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

基本上,您需要将UITableViewDataSource(也可能是委托)与委托分开,MFMasterViewController因此当执行 segue 时,您可以在视图控制器中设置正确的数据源和委托。

所以在导航控制器中你需要实现该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 在您的应用中采用故事板。

于 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 回答
1

我相信我终于找到了答案。我们想使用带有另一个类名的故事板 ViewController。有很多解决方法,比如使用委托,但我认为这是最好的一种。我已经在另一个话题中回答了。希望能帮助到你! https://stackoverflow.com/a/32103618/1943053

于 2015-08-19T19:13:22.510 回答