私はコンテナVCを最近頻繁に使用していましたが、メインVcとコンテナVC間で通信する最良の方法は何か不思議でした。今は通知を使用していますが、私はむしろより良いものを使いたいと思っています。少なくともコンテナVCへのポインタを取得して、委任を使用することはできますか?どんな良い方法?コンテナビューとの通信に関するベストプラクティスは何ですか
答えて
コンテナビューコントローラは、prepareForSegue:sender:
メソッドで自身と埋め込みビューコントローラとの間に必要な接続を設定する必要があります。
iOSプログラミングでは、View Controller間のこの通信スタイルのパターンがあります。それについては“Coordinating Efforts Between View Controllers” in the *View Controller Programming Guide for iOS”で読むことができます。
しかし、具体的な例を理解することは簡単だと思います。のは、iPhone用のGoogleマップのアプリを使ってみましょう:
私はこのアプリが実装されている正確にどのように知りません。しかし、検索バー(上部)とロケーションバー(下部)を管理するトップレベルのAppViewController
があり、コンテナビューにMapViewController
が埋め込まれているとします。
ビューコントローラ間にはいくつかの相互作用があります。ユーザーが検索すると、AppViewController
はMapViewController
にいくつかのマップマーカーを配置し、その1つを拡大するように指示する必要があります。ユーザーがマップマーカーをタップすると、MapViewController
はAppViewController
に、そのマーカーに関する情報を下部のロケーションバーに表示するように指示する必要があります。
パターンは次のとおりです。
@class MapMarker;
@class MapViewController;
@protocol MapViewControllerDelegate <NSObject>
- (void)mapViewController:(MapViewController *)mapViewController didSelectMarker:(MapMarker *)marker;
@end
我々はAppViewController
を行います。まず
は、我々はMapViewController
(埋め込みビューコントローラです)(コンテナビューコントローラがある)AppViewController
に送信されますが、メッセージのためのプロトコルを定義しますこのプロトコルに従う。したがって、MapViewController
は具体的にAppViewController
について知る必要はありません。プロトコルに準拠したオブジェクトへの参照が必要です。また、MapViewController
は、マーカーを設定するメッセージと、特定のマーカーをズームするメッセージを理解する必要があります。 delegate
プロパティが保持サイクルを避けるためにweak
であること
@interface MapViewController : UIViewController
@property (nonatomic, weak) id<MapViewControllerDelegate> delegate;
- (void)setMarkers:(NSArray *)markers;
- (void)zoomToMarker:(MapMarker *)marker;
@end
注:だから我々はこのようMapViewController
を宣言します。
AppViewController
は、MapViewControllerDelegate
プロトコルに準拠する必要があります。通常、適合性はAppViewController
のパブリックインターフェイスの一部である必要はないので、AppViewController.m
のクラス拡張の適合性を宣言します。 AppViewController
にはMapViewController
への参照も必要です。
は、今、私たちはプロパティを配線するprepareForSegue:sender:
メソッドを実装することができます:
@interface AppViewController() <MapViewControllerDelegate>
@property (nonatomic, strong) MapViewController *mapViewController;
@end
次に、我々はストーリーボードに入り、埋め込みセグエを選択し、それに識別子を与える
@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:
とを実装する必要があります10はsetMarkers:
とzoomToMarker:
を実装する必要があります。
うわー、素晴らしい答え! – woobione
- 1. Amazon EC2インスタンス間の通信のベストプラクティスは何ですか?
- 2. モデルとビューに関するベストプラクティスは何ですか?
- 3. アンドロイドでのサービスとの通信のベストプラクティス
- 4. Androidツールの場所に関するベストプラクティスは何ですか?
- 5. ASP.Netと通信するFlash Remotingのクライアントアーキテクチャは何ですか?
- 6. インターフェイス組織Visual Studioプロジェクトに関するベストプラクティスは何ですか?
- 7. ソースコード管理に関するベストプラクティスは何ですか?
- 8. iOS 5 SDKのコンテナビューとは何ですか?
- 9. ParentComponentとの通信、ログインステータスのベストプラクティス
- 10. winformsの通信のベストプラクティス?
- 11. プレゼンテーション層(ウィッケット)とビジネスロジック(スプリング)通信のベストプラクティス
- 12. フラグメントとアクティビティ間の通信 - ベストプラクティス
- 13. Djangoモデルフィールドのベストプラクティスとは何ですか?
- 14. 通信技術の観点からMicroservices APIを構築する際のベストプラクティスは何ですか?
- 15. スレッドエントリ関数と通常関数の違いは何ですか?
- 16. Spring 3.0とSOAP - ベストプラクティスは何ですか?
- 17. MVC3とEFデータ:ベストプラクティスは何ですか?
- 18. 「通信構造」のDCBとは何ですか?
- 19. シーケンス図と通信ダイアグラムの違いは何ですか?
- 20. Windowsの「通知送信」とは何ですか?
- 21. OOPデザイン:クラスのプロパティの数に関するベストプラクティスは何ですか?
- 22. 親ビューとコンテナビューは同じですか?
- 23. C#ベストプラクティス - intを変換するときのベストプラクティスは何ですか? to int
- 24. パスワードに関する一般的な登録エンドポイントのベストプラクティスは何ですか?
- 25. Angular2 - コンポーネントが更新されたときにディレクティブに通知するためのベストプラクティスは何ですか?
- 26. プロトタイプ関数とjavascriptの通常の関数との違いは何ですか?
- 27. Windows 10で通知を送信する方法(電子のベストプラクティス)?
- 28. データベースとの通信のベストプラクティス - POSTまたはGET?
- 29. OOPでは、クラス内で「this」を使用することに関するベストプラクティスは何ですか?
- 30. 機能のサポートを削除する "ベストプラクティス"とは何ですか?
コンテナビューと埋め込みセグがあるストーリーボードを使用しているか、ビューコントローラを作成してコードに接続していますか? –
内部が容器であるVc。ストーリーボードの使用 –