スーパービューがあり、サブビューを追加して選択します。スーパービュー (メイン ビュー) で次のことを行います。 [self.view addSubview:cityViewController.view];
cityView では、必要な作業が完了したら、self.view removeFromSuperView を実行します。
問題は、スーパービュー内から、サブビューが削除されたことをどのように確認できるかです。
いくつかの方法がありますが、正直なところ、現在のビュー コントローラー (メインと呼びましょう) は のビューを追加するだけなのでcityViewController
、現在のビュー コントローラーへのビューの追加/削除の処理を維持し、メイン コントローラーを呼び出すだけです。[cityViewController.view removeFromSuperView]
このようにして、この通知を受信したときに必要なコードを実行できます (起動するメソッドまたはUINotification
)。
-- サンプル UINotification コードの編集 --
main.m
...
//Define cityViewController as an iVar and alloc/init it
[[UINotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishView:) name:@"DidFinishView" object:nil];
[self.view addSubview:cityViewController.view];
...
-(void) didFinishView:(NSNotification *)notification {
[cityViewController.view removeFromSuperView];
}
CityViewController.m
-(IBAction) doneButtonClick:(id) sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"DidFinishView" object:nil];
}
簡単な答えは、あなたの見解はそれ自体を削除するべきではないということです。ビューでは、オブジェクト間通信メカニズムを介して、ユーザーの操作を関連するコントローラーに通信することをお勧めします。最も一般的な方法は、ダイレクトメッセージング、プロトコル、および通知です。iOSフレームワークはこれらすべてを使用しており、それらを説明する優れたドキュメントがあります。簡単な要約は次のとおりです。
ダイレクトメッセージング。これは、オブジェクトが既知のタイプの特定のオブジェクトと通信する必要がある場合に使用します。たとえば、MyView
が常に含まれていて、MyViewController
それにメッセージを送信する必要がある場合は、特定のオブジェクトMyView
へのポインタを保持するプロパティをクラスに追加できます。その後、経由などでMyViewController
メッセージを送信できます。myView
myViewController
[myView.myViewController userDidTapSaveButton]
プロトコル。プロトコルは、オブジェクトがコントラクトを順守すること以外はお互いについて何も知らないオブジェクト間のコントラクトを定義します。たとえば、UITableView
デリゲートがUITableViewDelegate
プロトコルに準拠していることを認識しており、必要なプロトコルメッセージをデリゲートに送信できます。どのオブジェクトもUITableViewDelegate
プロトコルに準拠できます。
通知。NSNotificationCenter
通知を使用すると、オブジェクトは、他のオブジェクトが監視および応答できる中央メカニズム()を介して通知を投稿できます。通知は、通知を投稿するオブジェクトが、通知を監視しているオブジェクトを認識または気にしない場合に役立ちます。
これらの方法について、SOに関する関連ドキュメントやその他のQ&Aを読みました。また、MVC(モデル/ビュー/コントローラー)のデザインパターンについても少し調べて、アプリロジックを配置する場所をより快適に理解できるようにします。一般に、ビューは、その表示(コントローラーによって設定されたプロパティに基づく)、ユーザーアクションの監視/応答、および関連するアクションについてコントローラーに通知することのみを担当する必要があります。