2012-09-04 88 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

相關問題