0

私は、uiviewcontroller (B) をロードする uivewcontroller (A と呼びましょう) を持っており、B を閉じて A でコードを続行するために使用するデリゲートとして設定します。B が別の uiviewcontroller C につながるシーンもあります (再びデリゲート)。C が閉じられたら、そのデリゲートを使用して B に戻りますが、このシナリオでは、B をすぐに破棄し、コードを A に戻すことも必要です。これで、B->A が機能し、C->B が機能しますが、C- を実行します>B->A が B で失敗し、「ビューが現在表示されていないモーダル ビュー コントローラーを閉じようとしています」というエラーが表示され、ビュー C を再度閉じようとしているようです。

両方のビューコントローラーがこのコードで閉じられています (コードは別の uiviewcontrollers にありますが)

[self dismissViewControllerAnimated:YES completion:nil];

目的のためにデリゲートを正しく使用していますか、それとも別のプロセスを使用する必要がありますか?

オプション 1 のコード (A->B、B<-A):

A -> B

scorer_turn *st = (scorer_turn *) segue.destinationViewController;
st.st_delegate=self;
st.league = _match.league;
st.match = _match;
st.leg = _leg;
st.set = _set;

B -> A

-(void)closeView{
[_st_delegate scorer_turn:self didFinish:YES];
}

-(void)scorer_turn:(scorer_turn *)controller didFinish:(BOOL)finish{
    [self dismissViewControllerAnimated:YES completion:nil];
}

オプション 2 のコード (A->B、B->C、C->B->A):

上記と同様: B -> C

matchSummaryViewController *ms = (matchSummaryViewController *) segue.destinationViewController;
ms.match = _match;
ms.oneScreen = NO;
ms.delegate = self;
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];

C -> B、B -> A

C: [_delegate matchSummaryViewController:self didFinish:YES]; B: [自己却下ViewControllerAnimated:YES完了:nil]; [_st_delegate scorer_turn:self didFinish:YES]; A (ここでエラーが発生します):

-(void)scorer_turn:(scorer_turn *)controller didFinish:(BOOL)finish{
    [self dismissViewControllerAnimated:YES completion:nil];
}
4

1 に答える 1

0

ViewController B が modalViewController で、ViewController C が同じ modalViewController にプッシュされる場合、

[self dismissViewControllerAnimated:YES completion:nil];

モーダルビュー全体を閉じる必要があります-同様に、Cを閉じてBをすべてスキップします(Bは表示されません)。これにより、BがdismissViewControllerAnimated:completionも呼び出そうとすると問題が発生します。解散。

ここで、B がモーダルであり、C を押すと実際に閉じて新しいモーダル ビューを起動するなど、他の設定がある場合 (これは、常にpresentViewController:animated:completion関数を使用する場合に発生します)、次に、他の設計上の問題があります-そのようにモーダルビューを交換するべきではなく、代わりに使用します

[self.navigationController pushViewController:C animated:YES]

ビューを表示し、

[self.navigationController popViewControllerAnimated:YES]

ビュー C を閉じてビュー B に戻ります。

もちろん、これは、view を管理するために navigationController を使用していることを前提としています (通常はこれを行う必要があります)。

一方、モーダル ビューをまったく使用していない場合は、dismissViewControllerAnimated:completion : はまったく使用したくないものです。

于 2013-10-21T19:10:19.363 に答える