iPhoneのスタックからView Controllerをポップした後、自動的にメソッドを呼び出す方法

StackOverflow https://stackoverflow.com/questions/1001441

  •  05-07-2019
  •  | 
  •  

質問

ナビゲーションスタックから子ビューをポップした後、iPhoneの親ビューを更新する必要があります。子がスタックからポップされ、親が再び表示されたときに通知されるように親ビューを設定したり、自動メソッド呼び出しを受信するにはどうすればよいですか?

ユーザーは、ユーザーが完了してビューをポップした後、親ページに表示したい子ページにデータを入力します。

ご協力ありがとうございます!

役に立ちましたか?

解決

この同じ問題を解決しました。上記の回答はほぼ正しいので、デリゲートの設定を忘れていました。

リストのサイズを表示し、リストのサイズを変更する可能性のある子View Controllerを呼び出し、戻り時にサイズを更新する必要があるルートView Controllerがあります。

親ビュー(下のSettingsView)を作成し、UINavigationControllerのルートビューとして追加するとき、ビューを表示する前にUINavigationControllerのデリゲートを設定することを確認します-これが重要な部分です:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv];
[nc setDelegate:sv];

親ビューで、UINavigationControllerDelegateプロトコルを実装します。

@interface SettingsView : UIViewController <UINavigationControllerDelegate>

そしてwillShowViewControllerメソッドを提供します:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Your code to update the parent view
}

これは、子ビューが閉じられた後、親ビューが再表示される前に呼び出されます。

他のヒント

私もこのようなことをする必要がありました。 UINavigationController を所有していた ViewController では、次のように willShowViewController を実装する必要がありました。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
}

このメソッドは、UINavigationControllerがビューを変更するたびに呼び出されます。私があなたの質問を正しく理解しているなら、私はこれがあなたが望むことをするべきだと思います。

ここには混乱があると思います。 UIView は、 UINavigationController のスタックにプッシュおよびポップされません。プッシュおよびポップされているのは UIViewControllers で、それぞれが1つまたは(多くの場合)複数のビューを処理します。

幸いなことに、 UIViewController には次のメソッドがあります:

-(void) viewWillAppear:(BOOL)animated;
-(void) viewDidAppear:(BOOL)animated;
-(void) viewWillDisappear:(BOOL)animated;
-(void) viewDidDisappear:(BOOL)animated;

これらは、ビューが表示されようとしている(表示されていない)か、表示されたばかりの(表示されている)ときに呼び出されます。タブバー、モーダルビュー、Navigation Controllerを使用しています。 (そして、カスタムコントローラーを実装するときにこれらを使用することをお勧めします。)

したがって、あなたの場合、私が正しく理解していれば、単に「親ページ」と呼ぶもので viewWillAppear :または viewDidAppear :メソッドをオーバーライドする必要があります。 (おそらく UIViewController によって処理されます)、入力したデータを反映するようにページの外観を更新するコードを挿入します。

(記憶が正しければ、 UINavigationController が最初に表示されたときに viewWill / DidAppear:メッセージを取得することを確認する必要があります。子コントローラーに送信されます。これをテンプレートまたはIBでセットアップする場合、おそらく心配する必要はありません。)

Felixyzの答えが私にとってのトリックでした。ビューが表示されるメソッドを呼び出すと、ビューが表示されるたびにメソッドが実行されます。ロードされたビューとは異なり、ビューが最初にロードされたときにのみコードを実行します。そのため、子ビューが親に表示される情報を変更し、サックからポップされた場合、親ビューはそれ自体を更新しません。しかし、親がビューを呼び出した場合、ビューが表示されるたびにコードが実行されます。

同時にスーパーメソッドを呼び出すようにしてください。適切な実装は次のようになります。

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}

あるコントローラーから別のコントローラーに通知する必要がある場合は、こちら(2番目の回答を参照)

残念ながら、説明したとおりの正確なタスクについては自動通知(AFAIK)はありません。 ニーズを満たすために、子コントローラーの viewWillDisappear 関数で委任する(つまり、親コントローラーに)メッセージを送信できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top