2012-05-30 23 views
0

我有一個容器視圖控制器與3個子UIViewController子類(addChildViewController添加)。我想讓我的一個子視圖控制器在從我的容器視圖控制器中刪除某些內容時執行某些操作。我很難理解這種溝通應該如何發生。如果我嘗試創建一個委託,我在我的子視圖控制器中出現錯誤,因爲我將這兩個子類相互導入。容器視圖控制器與childViewControllers通信

回答

5

這聽起來像你有問題編譯你的應用程序,因爲相互.h文件importing彼此對吧?

編輯:在再次閱讀你的問題,我不是100%清楚哪個瀏覽器需要調用哪些其他一個。如果我在我的解決方案中混合使用父視圖控制器和子視圖控制器的 角色,只需切換 即可。下面的技巧讓你任意兩個視圖 控制器(父母與子女,兄弟姐妹和兄弟姐妹等)

有許多方法來處理這之間的通信。如果你想留在一個delegate模式,你可以簡單地重寫頭,以避免#import在.h文件之一:

ParentViewController.h:

#import "ChildViewController.h" 

@interface ParentViewController: UIViewController { 
@private 
    ChildViewController* childVc; 
} 

- (void) doSomething; 

ChildViewController.h

@class ParentViewController; // NOT #import! 

@interface ChildViewController: UIViewController { 
@private 
    ParentViewController* parentVc; 
} 

ChildViewController.m

#import "ParentViewController.h" 

這應該避免循環依賴,使您的應用程序無法編譯。

現在,雖然上述工作,我可能會選擇另一種解決方案,爲了清潔。使用。家長可以實現協議,那麼孩子只需要有一個實現該協議的委託:

#import "MyProtocol.h" 

@interface ParentViewController: UIViewController<MyProtocol> { 

} 

- (void) doSomething; 

在MyProtocol.h:

@protocol MyProtocol 
- (void) doSomething; 
@end 
在ChildViewController.h

#import "MyProtocol.h" 

@interface ChildViewController: UIViewController { 
@private 
    id<MyProtocol> delegate; 
} 

@property (nonatomic, assign) id<MyProtocol> delegate; 

然後

而且在ChildViewController.m:

[delegate doSomething]; 

或者,您可以避免使用完全代表和communicate between the controllers using NSNotificationCenter,它們將它們分離一點,並避免編譯器循環(雙向依賴性)。

Here are the Apple docs on NSNotificationCenter

+0

NSNotifications非常棒!謝謝! –

+2

我同意在這裏使用協議。孩子不應該參考父母。但是,這不是使用NSNotificationCenter的合適位置。您將使用它來向多個對象廣播消息,而不僅僅是容器中的父對象。代表團是正確的解決方案。 – smileBot

2

你不能只是去:

MyChildViewController *myChildViewController = (MyChildViewController *)[self.childViewControllers objectAtIndex:0]; 
[myChildViewController doWhatever]; 

? 這應該讓你在數組childViewControllers(它是UIViewController上的一個屬性)的第一個索引處發送子視圖控制器。

+0

我可以,但我看不出這是比簡單地定義嵌套視圖控制器,並使用它們太大的不同。如果這不會破壞任何設計規則,我將非常樂意實施這種方法。 –

+0

我實際上無法說出最佳做法。 – geraldWilliam

相關問題