我完全重新制定了这个问题,因为我知道我原本偏离轨道但是让我无法解决问题。参考这张图片......
我想在代码中创建或操作segue(以黄色突出显示),以便主视图是MFMasterViewController
的多个子类中的任何一个(以红色突出显示)。
当使用Nibs执行此操作时,我可以创建一个Nib,SharedNib.xib
&将类设置为MFMasterViewController
,然后创建我的子类,比如MFMasterViewControllerSubclassA
,MFMasterViewControllerSubclassB
等。&然后实例化我想要使用的子类......
MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil];
...或
MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil];
等
关于如何使用故事板来解决这个问题的任何线索?
在我的情况下,想要这样做的原因是我的所有子类都是相同的tableview&数据但排序不同&对于写入细胞的细节文本有什么不同。我怀疑这是一种并不罕见的模式。
干杯& TIA, 佩德罗:)
答案 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