我有兩個控制器類A和B. A實例化幾個B.當在A中按下適當的按鈕時,A實例化一個B並將程序流傳遞給B.在B的運行結束我希望它將一些數據傳回給A.這怎麼可能?將數據從子視圖傳遞到父視圖 - iPhone
更確切地說,我有對象,我想返回到「A」 B運行的最後方法之後的一個NSArray ...
我有兩個控制器類A和B. A實例化幾個B.當在A中按下適當的按鈕時,A實例化一個B並將程序流傳遞給B.在B的運行結束我希望它將一些數據傳回給A.這怎麼可能?將數據從子視圖傳遞到父視圖 - iPhone
更確切地說,我有對象,我想返回到「A」 B運行的最後方法之後的一個NSArray ...
很多的選擇:
可能更多,但這些是我最常用的。
有幾種方法可以做到這一點,最簡單和最快的解決方案是使用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];
正如雷說,有多種方式,但最簡單的就是合格A
實例作爲參數傳遞給B
「然後調用A.whatever(...)
將數據傳回。定義和使用whatever(...)
方法作爲非正式協議可能是最容易的 - 您知道它存在,並且兩個模塊知道它存在,但代碼中沒有任何特定的要求它存在。
如果你想有一種方法來聲明B
將需要一個對象來回調並指定該對象必須能夠做什麼,你可以設置一個正式的協議。這就是說你需要一個對象,不一定是A
,而是任何符合MyBCallbackProtocol
的對象,你定義的對象需要有一個實例方法whatever(...)
。正式的協議讓編譯器檢查你傳入的對象肯定支持你想要的方法調用。
這可能是矯枉過正 - 但如果A
和B
之間的通信變得更加複雜,您可能需要使用它來確保您已經實現了所有您已經決定需要的方法。如果更改了A,則協議有助於確保B
仍能夠傳回其信息。
如果A
和B
對您的應用程序非常具體,NSNotificationCenter可能會過度使用。但是,它確實完全隔離B
,同時允許其他人從中獲取數據;如果B
被認爲是可重用的工具類,那麼值得考慮。
我不會在A中提及一個ivar;這就讓A的業務涉及B方式。
漂亮的寫作+1 – Rayfleck
嗨,你可以舉一個使用協議的例子嗎? – user559142
下面是一個很好的開始:http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Protocol.html – Rayfleck