2011-07-16 86 views
1

我有兩個控制器類A和B. A實例化幾個B.當在A中按下適當的按鈕時,A實例化一個B並將程序流傳遞給B.在B的運行結束我希望它將一些數據傳回給A.這怎麼可能?將數據從子視圖傳遞到父視圖 - iPhone

更確切地說,我有對象,我想返回到「A」 B運行的最後方法之後的一個NSArray ...

回答

3

很多的選擇:

  1. 保持你的數據在一個單獨的DataManager對象中,這兩個VC都可以引用
  2. 如果B發佈NSNotification完成了,並且A是該通知的觀察者,則將感興趣的數據傳遞給通知。
  3. 給B到一個IVAR參考中所述的,因此它可以直接設置值
  4. 給B到方法中所述的參考(可能通過聲明一個協議),所以它可以調用的方法和傳遞的數據的基礎上該辦法。

可能更多,但這些是我最常用的。

+0

嗨,你可以舉一個使用協議的例子嗎? – user559142

+1

下面是一個很好的開始:http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Protocol.html – Rayfleck

0

有幾種方法可以做到這一點,最簡單和最快的解決方案是使用NSNotificationCenter。藉助NSNotificationCenter,您可以訂閱併發送自定義通知。

NSNotificationCenter: 接收

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishParsing:) name:@"yourNoticationName" object:nil]; 
- (void)didFinishParsing:(NSNotification *)aNotification {...} 

發送

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"some", @"optional", @"data", @":)" nil]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourNoticationName" object:nil userInfo:userInfo]; 
1

正如雷說,有多種方式,但最簡單的就是合格A實例作爲參數傳遞給B「然後調用A.whatever(...)將數據傳回。定義和使用whatever(...)方法作爲非正式協議可能是最容易的 - 您知道它存在,並且兩個模塊知道它存在,但代碼中沒有任何特定的要求它存在。

如果你想有一種方法來聲明B將需要一個對象來回調並指定該對象必須能夠做什麼,你可以設置一個正式的協議。這就是說你需要一個對象,不一定是A,而是任何符合MyBCallbackProtocol的對象,你定義的對象需要有一個實例方法whatever(...)。正式的協議讓編譯器檢查你傳入的對象肯定支持你想要的方法調用。

這可能是矯枉過正 - 但如果AB之間的通信變得更加複雜,您可能需要使用它來確保您已經實現了所有您已經決定需要的方法。如果更改了A,則協議有助於確保B仍能夠傳回其信息。

如果AB對您的應用程序非常具體,NSNotificationCenter可能會過度使用。但是,它確實完全隔離B,同時允許其他人從中獲取數據;如果B被認爲是可重用的工具類,那麼值得考慮。

我不會在A中提及一個ivar;這就讓A的業務涉及B方式。

+0

漂亮的寫作+1 – Rayfleck