我最近經常使用容器VC,我一直在想,主VC和容器VC之間的最佳通信方式是什麼。現在即時通知使用,但我寧願使用更好的東西。我如何獲得一個指向容器VC的指針,以便至少可以使用委派?有更好的方法嗎?什麼是與容器視圖溝通的最佳做法
回答
容器視圖控制器在它的prepareForSegue:sender:
方法中建立它自己和嵌入式視圖控制器之間的任何必要連接。
在iOS編程中,我們有這種風格的視圖控制器之間的通信模式。你可以在「Coordinating Efforts Between View Controllers」 in the *View Controller Programming Guide for iOS」中看到它。
但我認爲用一個具體的例子來理解起來會更容易。讓我們用谷歌地圖應用的iPhone:
我不知道這個程序究竟是如何實現的。但假設有一個頂級AppViewController
管理搜索欄(位於頂部)和位置欄(位於底部),它將MapViewController
嵌入到容器視圖中。
視圖控制器之間存在一些交互。當用戶搜索時,AppViewController
需要告訴MapViewController
放置一些地圖標記並放大其中的一個。當用戶點擊地圖標記時,MapViewController
需要告知AppViewController
在底部的地址欄中顯示有關該標記的信息。
所以這裏的模式。
首先,我們定義爲消息的協議,該MapViewController
(其嵌入視圖控制器)將發送到AppViewController
(它是容器視圖控制器):
@class MapMarker;
@class MapViewController;
@protocol MapViewControllerDelegate <NSObject>
- (void)mapViewController:(MapViewController *)mapViewController didSelectMarker:(MapMarker *)marker;
@end
我們將使AppViewController
符合這個協議。所以MapViewController
不需要特別知道AppViewController
。它只需要引用一些符合協議的對象。 MapViewController
還需要了解設置其標記和放大到特定標記的消息的消息。因此,我們宣佈MapViewController
這樣的:
@interface MapViewController : UIViewController
@property (nonatomic, weak) id<MapViewControllerDelegate> delegate;
- (void)setMarkers:(NSArray *)markers;
- (void)zoomToMarker:(MapMarker *)marker;
@end
注意,delegate
屬性是weak
避免保留週期。
AppViewController
需要符合MapViewControllerDelegate
協議。通常,我們在AppViewController.m
的類擴展中聲明該一致性,因爲一致性不需要是AppViewController
的公共接口的一部分。 AppViewController
也需要參考MapViewController
。
@interface AppViewController() <MapViewControllerDelegate>
@property (nonatomic, strong) MapViewController *mapViewController;
@end
接下來,我們進入故事板,選擇嵌入SEGUE,並給它一個標識符:
現在我們可以實現prepareForSegue:sender:
方法要連接的屬性:
@implementation AppViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"MapEmbedding"]) {
[self prepareForMapEmbeddingSegue:segue sender:sender];
}
}
- (void)prepareForMapEmbeddingSegue:(UIStoryboardSegue *)segue sender:(id)sender {
self.mapViewController = segue.destinationViewController;
self.mapViewController.delegate = self;
// We can do any additional setup on mapViewController here,
// like set its initial viewport.
}
請注意AppViewController
也必須執行mapviewController:didSelectMarker:
和MapViewController
需要執行setMarkers:
和zoomToMarker:
。
哇,很好的回答! – woobione
- 1. 溝通表單的最佳做法是什麼?
- 2. 添加視頻背景視圖的最佳做法是什麼?
- 3. 最佳做法是什麼?
- 4. 什麼是與DLL互相溝通的最佳方式
- 5. 與Bonjour溝通的最佳方式是什麼?
- 6. 管理容器中線程池的最佳做法是什麼?
- 7. Views中的視圖 - 什麼是最佳做法
- 8. 控制多個視圖的最佳做法是什麼?
- 9. 改變視圖狀態的最佳做法是什麼?
- 10. 溝通的最佳方式是什麼? WebServices還是WebApi?
- 11. log4cxx的最佳做法是什麼?
- 12. 什麼是ViewModel的最佳做法
- 13. 什麼是實現一個Qwebview溝通的最佳方式?
- 14. 鼓勵團隊溝通的最佳方式是什麼?
- 15. 讓kubenetes豆莢互相溝通的最佳方式是什麼?
- 16. Nginx和runit ....什麼是最佳做法
- 17. WCF休息 - 最佳做法是什麼?
- 18. ASP.NET緩存,什麼是最佳做法
- 19. 使用Sharepoint作爲Scrum溝通工具的最佳做法
- 20. 與DataGrids一起使用AJAX的最佳做法是什麼?
- 21. 通過Flash提供最高品質的視頻體驗,您的最佳提示/最佳做法是什麼?
- 22. 當爲圖庫存儲圖像時,最佳做法是什麼?
- 23. 容器註冊的最佳做法?
- 24. 通過瀏覽器與Catia溝通的最佳方式
- 25. 真的保留IBOutlet視圖元素的最佳做法是什麼?
- 26. 在類庫中實例化Castle Windsor容器時的最佳做法是什麼?
- 27. 在Android上緩存圖像的最佳做法是什麼?
- 28. 在Android上使用SVG圖標的最佳做法是什麼?
- 29. 圖像服務的最佳做法是什麼?
- 30. 什麼是合併兩幅地圖的最佳做法
您是否正在使用容器視圖和嵌入式Segue的故事板,或者您是否在代碼中創建和連接視圖控制器? –
Vc內有一個容器。使用故事板 –