web-dev-qa-db-ja.com

「<ViewController>の外観の遷移を開始/終了するための不均衡な呼び出し」エラーが引き続き発生する

almost完全に実行されているアプリがあります。アプリの構造は次のとおりです。

ストーリーボード上の合計6個のView Controller。最初の3つのView Controllerが最も重要です。最初のView Controllerには、「ログイン」および「サインアップ」ボタンがあります。 「ログイン」ボタンはログインView Controllerをモーダル表示し、「サインアップ」ボタンはサインアップView Controllerをモーダル表示します。

サインアップView Controllerには、ユーザー名、パスワード、電子メールの3つのフィールドがあり、「送信」ボタンがあります。送信ボタンはデータをWebサーバーに送信し、すべてが正常に送信されると、それ自体で「performSegueWithIdentifier」メソッドを呼び出します。

ステートメントは次のとおりです。

[self performSegueWithIdentifier:@"superSegue" sender:self];

上記のメソッド呼び出しを機能させるために今夜2時間を費やしましたが、最終的に機能します。動作させるには、ストーリーボードでサインアップビューコントローラーを選択し、エディター>埋め込み>ナビゲーションコントローラーに移動する必要がありました(覚えている場合、サインアップビューコントローラーがモーダルモードで表示されるため、これを行う必要がありました)。次に、サインアップView Controllerの送信ボタンから、プッシュ先のView Controllerにドラッグしてプッシュを選択し、識別子名を入力しました。

とにかく、メソッド呼び出しを使用してプッシュしたView Controllerの戻るボタンを使用するまで、上記のすべてが完全に正常に動作します。戻るボタンをタップすると、上部に空白のナビゲーションバーがあり、戻るボタンがある90%の黒い画面に移動します。もちろん、その戻るボタンも何もしません。

これは、コンソールに表示されるエラーです。

Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>

検証View Controllerは、Signup View ControllerがperformSegueWithIdentifierメソッドを介してプッシュするView Controllerです。

このエラーを修正する方法を知っている人はいますか?

私のストーリーボードがxcodeでどのように見えるかのスクリーンショットを以下に掲載しました。私がコーディングしたがまだ接続されていないView Controllerがあり、とにかく違いはないはずなので、Login VCの右側にあるView Controllerを無視できます。

enter image description here

22
user3117509

今朝、別のstackoverflowの質問で答えを見つけました。答えは here です。

プッシュセグエを最初にセットアップしたとき、ボタンをクリックしてドラッグし、そのボタンのIBActionメソッド実装内でperformSegueWIthIdentifierメソッドを呼び出していました。これにより、ボタンを押すと2つの同一のプッシュセグエが実行されました。 IBActionにメソッド呼び出しを残し、古いプッシュセグエを削除し、今回だけボタンの代わりにView Controller全体からドラッグしてドラッグした新しいプッシュセグエを作成しました。

12
user3117509

これをラッピングすることでこの問題を解決しました。

dispatch_async(dispatch_get_main_queue()) {
    //call your performSegueWithIdentifier in here
}
10
CodeOverRide

私の場合、それはUITabBarControllerのサブクラスで、オーバーロードされたsetSelectedIndex:アニメーションでトランジションを行うメソッド。アニメーションを開始する前に、次を呼び出す必要があることがわかりました。

[sourceVC viewWillDisappear:YES];
[destinationVC viewWillAppear:YES];

完了ブロックでは次のようになります。

if (finished) {
    [sourceVC viewDidDisappear:YES];
    [destinationVC viewDidAppear:YES];
    [super setSelectedIndex:selectedIndex];
}

アニメーションが終了する前に複数のselectedIndexが変更された場合、問題は引き続き発生する可能性があります。

3
user3099609

エラーの理由:このメッセージは、現在のView ControllerのviewWillAppear、loadView、initまたはviewDidLoadメソッドから別のView Controllerをプッシュ/提示している場合に表示されます

ソリューション:プッシュ/プレゼンテーションコードをviewDidAppearメソッドに移動すると、問題が解決します

その理由は、viewDidLoadではすべての派手なアニメーションが既に終了しているのではなく、viewDidAppearではすべてが完了しているためです。

1
foram

私はそれを働いて、それは私にとって良いですエラーの理由:このメッセージはTabBarControllerから別のView Controllerをプッシュ/提示している場合に表示されます、解決策:_viewController.modalPresentationStyle = .overCurrentContext_を設定してからviewControllertopViewController.present(vc, animated: true, completion: nil)を提示してください

1
anh hoang

私の場合、この警告は、モーダルビューが表示されているときにUINavigationControllerのpopToRootViewControllerを呼び出すことによって発生しました。モーダルビューが閉じられた後にpopToRootViewControllerを移動すると、警告が表示されなくなります。

1
slobodans