2012-09-04 93 views
14

我完全重新制定了这个问题,得知我原本偏离了轨道,但让我没有更接近解决问题。参照该图像... storyboard illustration如何在多个UIViewControllers之间共享一个故事板场景

我想创建或操纵在代码中SEGUE(以黄色突出显示),使得主视图是一个数字的子类MFMasterViewController中的任一个(以红色突出显示)。

当这种使用笔尖我可以创建一个笔尖做,SharedNib.xib &设置类为MFMasterViewController,然后创建我的子类,说MFMasterViewControllerSubclassAMFMasterViewControllerSubclassB等&然后实例化我想要使用哪个子...

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

或...

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

任何关于如何使用故事板获得此权利的线索?

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

干杯& TIA, 佩德罗:)

+0

我知道我可以通过在故事板中为每个子类创建一个场景副本来做到这一点,但当场景完全相同时,这似乎是一种相当浪费的方式,所有版本都会继续相同的下一个现场。 – Pedro

+0

故事板中的控制器分配给'MyViewController'类,而'MyViewControllerSubclass'是'MyViewController'的子类 –

+0

对这两个问题都是这样:) – Pedro

回答

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

如果你的.m文件不与任何故事板相关,不会self.storyboard是零?

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

在我的示例中,我称为MyViewController的类属于我的故事板中的场景以及我问题工作中的前2个代码示例。 MyViewControllerSubclass是MyViewController的子类,但代码调用失败。 – Pedro

+0

- (ID)initWithIdentifier:(的NSString *)标识源:(UIViewController中*)源目标:(UIViewController中*)目的地{ UIStoryboard *故事板= [UIStoryboard storyboardWithName:@ “MainStoryboard_iPhone” 束:无]; UIViewController * viewController = [storyBoard instantiateViewControllerWithIdentifier:@“testIdentifier”]; // MyViewController * viewController = [[MyViewController alloc] initWithNibName:@“MyViewController”bundle:nil]; return [super initWithIdentifier:identifier source:source destination:viewController]; } – prashant

3

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

1

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

相关问题