在我的UIViewController A
我有一些容器視圖,加載一些其他UIViewController B
。 我希望UIViewController A
能夠知道在自己的容器中發生了什麼。從容器視圖獲取數據
問題是,我無法從容器訪問到其中的視圖。 例如,容器有一個視圖控制器,其中有一個textfield
,我想讓viewA知道某人何時開始輸入。
我必須使用delegates
,或者有從容器視圖中獲取數據的方法嗎?
在我的UIViewController A
我有一些容器視圖,加載一些其他UIViewController B
。 我希望UIViewController A
能夠知道在自己的容器中發生了什麼。從容器視圖獲取數據
問題是,我無法從容器訪問到其中的視圖。 例如,容器有一個視圖控制器,其中有一個textfield
,我想讓viewA知道某人何時開始輸入。
我必須使用delegates
,或者有從容器視圖中獲取數據的方法嗎?
孩子UIViewController can access it's parent with
parentViewController`並使用它發送消息給父母。您可以直接執行此操作,但是...
根據交互級別,可能最好創建父級UIViewController
實現的接口。當孩子UIViewController
被添加到父級時,它會獲得對實現該接口的對象的引用。它提供了對象之間的強大交互,但也保持適當的封裝,並且它是委託模式。
所以我的答案是,你不必使用委託模式,但它似乎是一個合適的解決方案。如果你不使用委託模式,你可能會發現自己有一對如此緊密耦合的對象,你可能會把它變成一個對象。
// Somewhere in your view controller A you want to add B as a child
B *b = [[B alloc] init]; // create view controller B
b.delegate = self; // set up A as the delegate to B
// Add B as child
[self addChildViewController:b];
[self.containerView addSubview:b.view];
當B
被添加作爲一個孩子A
委託被設定。假設A
實現一個接口,B
將具有一個屬性,如@property (weak, nonatomic) id<MySomethingDelegate> delegate;
B
應該能夠在任何時刻調用任何委託方法。
謝謝。首先,我不能將一個委託監聽器添加到視圖控制器實例,因爲UIViewcontroller * sv比不允許執行[sv setDelegate:self]。第二,關於你最後的選擇,你能告訴我一些方向嗎?我無法理解你的意思.. – Curnelious
你不能那樣做。如果我做B * b而不是UIViewcontroller * b,它不會讓我把它作爲孩子添加它...... – Curnelious
'B'必須是'UIViewController'的子類。 – DBD
什麼是你打電話給'容器'? UIViewController後面的self.view?顯然對其他人來說並不明顯,至少不要像我這樣的笨蛋。 –
MVC。對文本字段的更改應存儲在某個模型類的某處(可能全局定義)。視圖控制器管理這個輸入,一旦它在模型中,你可以在任何地方看到它。 – trojanfoe
@trojanfoe這不是答案。我知道如何分享數據。我需要某種委託,我想告訴父母對剛剛發生的事情的看法。 l番茄,你不是一個白癡..是的,你說的是真的,它是一個容器視圖,我去self.view。 – Curnelious