2013-05-05 166 views
0

我有一個簡單的測試項目。嵌入在故事板中導航控制器內的UITableViewController(MasterViewController)。我不會繼續使用prepareForSegue將數據傳遞給另一個視圖控制器(DetailViewController)。相反,didSelectRowAtIndexPath方法是使用更新,如下圖所示detailviewcontroller標籤:直到此時工作正常UITableView在控制器之間傳遞數據嵌入容器

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    DetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; 
    NSMutableString *object = thisArray[indexPath.row]; 

    detailViewController.passedData = object; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

一切。

現在我在故事板中添加了另一個視圖控制器。使它成爲初始視圖控制器,在其中添加兩個容器,然後在這些容器中嵌入MasterViewController和DetailViewContainer。

現在,不是在右側的DetailViewController中顯示傳遞的數據,而是通過替換控制器視圖來顯示左側的傳遞數據。

如果我不能澄清我想說的話,這裏是鏈接到項目https://jumpshare.com/v/UiTFEB6AamIo8qX9sinW,它只是爲了學習的目的。

感謝

回答

2

你得到這個問題,因爲你還在這樣做:

[self.navigationController pushViewController:detailViewController animated:YES]; 

你在這裏引用的導航控制器是您的主控制器嵌入到一個,所以你創建detailController的一個實例(與已經在屏幕上的實例不同)並將其推送到導航控制器上。

你想要做的是得到已經在屏幕上的詳細控制器的引用 - 子視圖控制器(容器視圖中的子控件)已經在應用程序啓動時實例化。所以,你需要這樣做:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    DetailViewController *detailViewController = [self.navigationController.parentViewController childViewControllers][1]; 
    NSMutableString *object = thisArray[indexPath.row]; 
    detailViewController.passedData = object; 
} 

這將價值傳遞給控制器​​的細節,但你不能有代碼更新viewDidLoad中的標籤,因爲這種觀點已經被加載,並榮獲」不會再被調用。相反,會覆蓋passedData的二傳手,並更新標籤存在(請注意,我改變了參數passedInData的名稱,因此它不會與你的財產passedData衝突):

-(void)setPassedData:(NSString *)passedInData { 
    passedData = passedInData; 
    detailDescriptionLabel.text = passedData; 
} 

卜的方式,除非你打算在你的主視圖控制器之後添加其他控制器,根據設置,沒有理由將它嵌入到導航控制器中。如果您將其取出,那麼當您獲取對詳細控制器的引用時,您需要刪除對self.navigationController的引用。它會然後是:

DetailViewController *detailViewController = [self.parentViewController childViewControllers][1]; 
+0

如果包含兩個容器的視圖控制器本身嵌入另一個視圖控制器內,它不保留初始視圖控制器會怎麼樣?它會起作用嗎?還是需要更多的調整? – AJ112 2013-05-05 04:35:20

+0

@ AJ112,不需要調整 - 控制器仍然是嵌入容器視圖的父控制器,所以你仍然可以用同樣的方法引用它。 – rdelmar 2013-05-05 04:43:27

+0

如果我有其他數據對象傳遞給詳細視圖控制器,我可以做更多類似於setPassedData的方法。對? – AJ112 2013-05-05 05:05:14