0

我有一個單一的MainViewController,當然它是一個主要的UIView。我有這個主視圖由許多不同的子視圖組成。如何從另一個UIViewController訪問一個UIViewControllers屬性?

其中一些子視圖有它們自己的ViewController。

比方說在主要視圖(其代表主要是MainViewController)具有加載使用一個單獨的UIViewController- SecondaryViewController爲代表的大多數IT的行動另一個UIView的容器。

該容器視圖經由

MyContainerViewController *myContainerController = 
     [[MyContainerViewController alloc] ...]; 
[self addSubView: myContainerController.view]; 

當然在加載MainViewController用於myContainerController.view控制器雖然是MyContainerViewController。如何在該控制器內部訪問MainViewController屬性?具體而言,我需要訪問MainViewController的 - self.navigationController屬性來推送一個新的ViewController? :)

這是否有任何意義?我認爲會有一些涉及的鑄造,因爲它似乎我需要以某種方式保留在SecondaryViewController內的MainViewController的引用?

回答

2

從MainViewController的SecondaryViewController中推入一個新的ViewController是沒有意義的。 這就搞砸了代碼的設計。一個子對象將訪問其父項方法來調用一個方法。換句話說:糟糕的代碼。 進行從SecondaryViewController到其狀態已更改的MainViewController的委託調用。然後,MainViewController可以決定如何處理這個調用,並且SecondaryViewController不會知道任何關於MainViewController的實現。因此: 在SecondaryViewController中創建一個協議。 讓MainViewController成爲SecondaryViewController的委託。 在推送新ViewController的MainViewController中實現委託方法。

0

將所需的子視圖控制器公開爲包含它們的視圖控制器的屬性。

將您的根視圖控制器公開爲您的應用程序委託的屬性,並對其進行合成。

當你要訪問一個不同的UIViewController,首先獲得您的appDelegate參考:

MyAppDelegate* myAppDelegate = [[UIApplication sharedApplication] delegate]; 

然後,只需用你的屬性鏈到你想要的視圖控制器的訪問。

SubSubViewController* ssvc = myAppDelegate.rootViewController.subViewController.subSubViewController; 

有些人看不慣使用sharedApplication類的方法來獲得參考,以委託的,但我已經用它在多個應用程序,而不是遭受它(還)。另一種方法是通過你的viewControllers層次來管你的appDelegate。

+0

不好意思這麼說,但是這使得SecondaryViewController知道MainViewController的實現,它實際上是它的父類。錯誤的代碼設計。 – 2011-02-15 23:05:38

+0

不 - MainViewController知道SecondaryViewController,但Secondary不知道Main。 (參考文獻都指向「向下」)。 – 2011-02-15 23:15:41