2013-08-02 15 views
3

我是iOS編程的新手,我閱讀了很多教程和論壇,但仍然無法找到管理項目的最佳方式。在同一個視圖控制器中的兩個容器之間傳遞數據

我想要的是iPad屏幕並排顯示一個CollectionView和一個TableView。 CollectionView中的操作應該更改TableView內容。由於Split的固定大小,SplitViewController不會完成這項工作。

現在我正在使用Storyboard,我創建了一個ViewController並在其中添加了兩個ContainerViews。每個容器都通過XCode生成的segue鏈接到視圖控制器(LeftViewController和RightViewController)。

我想找出最聰明的方法來管理LeftViewController上的操作並將更改發送到RightViewController。

我想使用Storyboard,似乎更優雅,但我不知道如何實現這一點。

+0

你想讓主viewController成爲兩個控制器的委託如果你需要代碼示例,我會提供一些。 – AMayes

+0

非常感謝,這是我正在等待的那種答案。歡迎使用代碼示例:) – Toz

回答

2

假設您知道建立委託方法的方式(@protocol,請參閱here for links),關鍵元素將抓取嵌入在容器中的兩個viewController,因爲它們正在加載,將主viewController設置爲委託,併發送消息當有事情發生變化對於初學者來說,如果通信需要在兩個控制器之間流動,爲每個VC設置一個實例變量。

鑑於VCPrime,CollectionVC和TableVC:

首先,在故事板,名字每個塞格斯的(從containerViews到VCS)。在VCPrime,實現prepareForSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"collection"]) { 
     self.collectionVC = (CollectionVC *)[segue destinationViewController]; 
     self.collectionVC.delegate = self; 
    } 
    if ([segue.identifier isEqualToString:@"table"]) { 
     self.tableVC = (TableVC *)[segue destinationViewController]; 
     self.tableVC.delegate = self; 
    } 
} 

您還必須實現VCPrime委託方法,並聲明CollectionDelegate, TableDelegate,不過還是你叫他們。

在CollectionVC,當有人選擇的東西(或其他),檢查委託迴應您的委託方法,然後發送該消息:

if ([self.delegate respondsToSelector:@selector(doSomething)]) [self.delegate doSomething]; 

然後在被調用的方法改變TableVC。

這只是一個快速的破敗。互聯網是活着的偉大的代碼示例。

+0

謝謝!很好,我認爲賽格僅用於全屏頁面之間的轉換。 – Toz

1

我想我可能在Swift有一個改進(答案很老,但我一天前面臨這個問題)。我在Swift中重新實現了上面的內容,但有一個轉折點。不要將VCPrime設置爲CollectionVC和TableVC的委託,我會讓TableVC成爲CollectionVC的代表。這是因爲CollectionVC需要控制TableVC。一般我們可以稱爲「主控VC」控制的和「委託VC」控制的。爲了確保這兩個VC實際上是在我將其中一個設置爲另一個的委託時實例化的,我使用了Swift optionals和可選的綁定。這裏是一個代碼示例「(注意主人需要有一個」委託「屬性,你可能想要聲明相應的協議):

import UIKit 

class ContainerController: UIViewController { 

    private var masterViewController: myMasterViewController? 
    private var delegateViewController: myDelegateViewController? 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "myMasterViewController" { 
      masterViewController = segue.destinationViewController as? myMasterViewController 
     } else if segue.identifier == "myDelegateViewController" { 
      delegateViewController = segue.destinationViewController as? myDelegateViewController 
     } 
     if let master = masterViewController, delegate = delegateViewController { 
      println("Master and delegate set") 
      master.delegate = delegate 
     } 
    } 
} 
相關問題