10

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

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

助けてくれてありがとう!

4

5 に答える 5

13

私はこの同じ問題を解決しました-上記の答えはほぼ正しいです.デリゲートの設定を忘れていました.

リストのサイズを表示し、リストのサイズを変更する可能性のある子ビューコントローラーを呼び出し、返されたときにサイズを更新する必要があるルートビューコントローラーがあります。

親ビュー (下の 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
}

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

于 2012-01-23T07:50:37.793 に答える
6

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

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

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

于 2009-06-16T13:34:24.383 に答える
3

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

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

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

これらは、ビューが表示されようとしている (消えている) とき、またはちょうど (消えている) 直後に呼び出されます。タブバー、モーダル ビュー、ナビゲーション コントローラーを扱っています。(そして、カスタム コントローラーを実装するときにこれらを利用することをお勧めします。)

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

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

于 2009-06-16T17:47:10.933 に答える
2

Felixyzの答えは私のためにトリックをしました。ビューが表示されるメソッドを呼び出すと、ビューが表示されるたびにコードが実行されます。view did load とは異なり、ビューが最初に読み込まれたときにのみコードを実行します。そのため、子ビューが親に表示された情報を変更した場合、親ビューはそれ自体を更新せず、その後袋から取り出されました。ただし、親呼び出しビューが表示される場合は、ビューが再び表示されるたびにコードが実行されます。

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

- (void)viewWillAppear:(BOOL)animated
{
   [super viewWillAppear:animated];
    NSLog(@"View Appearing");
}
于 2013-01-10T20:22:35.657 に答える
0

あるコントローラーを別のコントローラーに通知する必要がある場合は、ここで説明されている委任パターンを使用できます (2 番目の回答を参照)

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

于 2009-06-16T20:10:16.550 に答える