2013-03-21 185 views
0

我相信這是非常基本的,但我一直無法找到任何有關它。設置代理

我有一個viewController女巫有一個模式segue到一個導航控制器與一堆表單工作表viewControllers。像這樣:

的viewController A ---(模態賽格瑞)---> navigationController --->的viewController乙--->的viewControllerÇ

在CI的viewController取得委託,像這樣:

@protocol ViewControllerCDelegate <NSObject> 
- (void)myMehtod; 
@end 

@interface ViewControllerC : UIViewController 

@property (nonatomic, assign) id <ViewControllerCDelegate> myDelegate; 

(我已經合成myDelegate)

我想設置myDelegate是A.的viewController我的問題是,在這裏?我該怎麼辦?

我試圖以這一個的viewController的viewDidLoad中:

ViewControllerC *delegateController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerC"]; 
delegateController.myDelegate = self; 

但委託不出現才能完成設置。想法?

+1

你確定'delegateController'實際上正在被實例化嗎?你是否堅持在某個地方的參考? – 2013-03-21 18:04:22

+0

您確定您在上述代碼段中引用的ViewControllerC實例是最終實際使用的嗎?也就是說,你沒有在別處實例化相同的視圖控制器? – 2013-03-21 18:07:36

+0

您應該在ViewControllerC出現時設置委託,而不是在ViewControllerA出現時進行設置。而且你不需要綜合myDelegate。 – AMayes 2013-03-21 18:08:35

回答

0

當您執行instantiateViewController時,您正在創建一個新的 ViewControllerA。如果你想要現有的ViewControllerA,你需要將它傳遞給控制器​​鏈。如果這變得有問題,您可以在應用程序委託上創建一個屬性來存儲它。在哲學上,有些人可能反對使用應用程序委託作爲全局變量交換所,但它可能比將指針向下傳遞到4級視圖控制器更清潔。你確定在這種情況下你需要委託模式嗎?也許NSNotificationCenter將是一個更清潔的選擇?

+0

有意義。但是,你能給我一個訪問viewController的例子嗎? – Michael 2013-03-21 18:42:08

+0

您像訪問其他實例變量或屬性一樣訪問它。既然你有「B」的方式,你可以在B上創建一個屬性來保存對A的引用,然後將它傳遞給C.所以你應該在從A到B的prepareForSegue中這樣做。然後當B創建C,將A的引用粘貼到C中。當B並不真正需要對A的引用時,除了將其傳遞外,這種說法有點笨拙。這就是爲什麼我認爲另一種設計可能更清潔。不知道你需要C來與A溝通,但很難說。也許你真的需要一個獨立的數據模型,A&C都觀察? – jsd 2013-03-21 22:14:40