3

私のアプリは、スプリットビューコントローラーでストーリーボードを使用しています。左側には、オプションのリストを含むテーブルビューがあります。右側には、左側のオプションに関する情報があります。設定アプリと同じです。ユーザーが左側のオプションを選択すると、右側の内容が変わります。左側のオプションごとに 1 つのビューコントローラーがあります。これらのビュー コントローラーは、ナビゲーション ビュー コントローラー (ビュー コントローラーごとに 1 つのナビゲーション ビュー コントローラー) 内に埋め込まれています。

ユーザーが左側のオプションを選択すると、セグエが実行されます。そのタイプは「置換」で、その宛先は「詳細分割」です。

私の問題は、ユーザーが左側のオプションを選択するたびに、右側のビューコントローラーの viewWillDisappear が 2 回呼び出されることです。なぜそれが起こっているのですか?

4

3 に答える 3

7

私もこれを持っていましたが、私の問題は、間違ったスーパーメソッドを呼び出していたことであることが判明しました。私の場合、オーバーライドしていたメソッドのメソッド[super viewDidAppear:animated]内で呼び出しています。- (void)viewDidDisappear:(BOOL)animatedおそらくあなたの問題ではありませんが、誰かがこの日につまずいた場合に備えて.

于 2014-02-26T04:32:43.557 に答える
1

最初に言っておきますが、これはまずいです。私もこの問題に遭遇し、あなたの投稿を見つけました。-viewDidDisappear:実験の結果、が呼び出されるのは 1 回だけであることに気付きました。そのため、二重呼び出しの原因となっているバグ (View Controller が SplitView の UINavigationController 内にある場合) は、viewDidDisappear では発生していないようです。

馬鹿馬鹿しいが、虫も馬鹿だ。お役に立てれば。

于 2014-02-20T03:52:34.713 に答える
0

OK、私はこれを調査するのにしばらく時間を費やしましたが、最終的には回避策を講じる必要がありました.

私の状況では、詳細ビューのコンテンツを保存せずに詳細ビューを「離れる」場合にアラートを表示したいと考えています。

インスタンス変数 boolean を追加しました。最初は false (NO) に設定されています。

次に、viewWillDisappear で、ブール値が NO の場合は YES に設定し、アラートを表示します。

次に、ブール値を NO is viewDidDisappear にリセットします (これは Alert コールバックでも実行できます)。

それほどエレガントではありませんが、これで十分に機能するようです。

- (void) viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if ([self isDirty] && ![self showingAlert])
    {
        [self setShowingAlert:YES];

        UIAlertView *alert =
             [[UIAlertView alloc]
                    initWithTitle: @"Save Changes?"
                    message: @"Use it or lose it, matey."
                    delegate: self
                    cancelButtonTitle:@"Save"
                    otherButtonTitles:@"Don't Save",nil];

        [alert show];

        [alert release];
    }
}

- (void) viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [self setShowingAlert:NO];
}
于 2012-09-06T12:37:17.060 に答える