<FirstViewController:0x2a2c00>の外観遷移を開始/終了するための不均衡な呼び出し


93

アプリをシミュレートするとこの問題が発生します。エラーや警告ではありませんが、コンソールに表示されます。これまでにこれを経験したことはありますか?


そのView Controllerで何らかのアニメーションを作成しますか?

1
はい。画像をスライドさせて開くオープニングアニメーションがありますが、このエラーはコードを電話に読み込んでいるときにのみ発生することに気づきました。
C.Johns

エラーメッセージは遷移の開始を提案していますが、対応するendメソッドへの呼び出しがありません。

1
同じことを手に入れました。これに対する解決策はありますか?
seeafish '27

また、これに対する解決策を探しています
barfoon

回答:


48

私の場合、このエラーは、テーブルビューで2つのタブを非常に速くクリックしたときに発生します。

結果は間違ったタイトル名を引き起こし、戻るボタンが消えます。誰かがあなたがビューを押すとき、と述べましたset animated:NO。エラーは消えますが、それでもいくつかの奇妙な動作を引き起こします。2つのビューをプッシュするため、tableview画面に戻るには2回戻る必要があります。

この問題を解決するために試した方法:

追加 BOOL cellSelected;

viewWillAppear cellSelected = YES;

didselectcellデリゲート if (cellSelected){cellSelected = NO; do action ; }

これにより、2つの異なるセルが非常に速くクリックされるのを防ぐことができます。


5
私の推測では、一部の表現が理解しづらかったようです。読みやすくするために、いくつかの編集を行いました。
カイルクレッグ

42

私の場合[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];UINavigationControllerアイテムのviewDidLoadメソッド内でトリガーしたときに発生 しました。

viewDidAppearメソッドに移動することで問題は解決しました。

可能性が非常に高いのは、viewDidLoadすべてのファンシーアニメーションが既に完了しているわけではなく、すべてが完了しているviewDidAppearためです。


ありがとう。私はすべてのUI要素のthro 'コードを作成していた穴居人の時代に迷っていました。ストーリーボードのものは私にとって新しいものです。
キランクルカルニ2014年


15

これを回避するには、コードを別のループで実行する必要があります

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

7
より良いアイデアは、提示するアニメーションdispatch_asyncをメインキューの中に入れることです。事は、dispatch_asyncメインキュー上の他のすべてのアニメーションが完了するまで、それは待つということです。次の理由により、遅延を使用するよりもはるかに優れています。1-遅延が十分であるかどうかは決してわからない、それはホストデバイスに依存します2-遅延をやりすぎてしまい、何かが遅れます。これを試してください:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

同じ問題で多くの問題がありました。この方法でこれを解決しました

1)UIViewController's指定された初期化子を使用していないinitWithNibName:bundle:。ただの代わりにそれを使ってみてくださいinit

2)animated:YESNOに設定すると、問題が解決します。例えば。[self.navigationController pushViewController: viewController_Obj animated:NO];


7

ナビゲーションコントローラーを使用して同じ問題が発生し、他のコントローラーをプッシュしました。Buffered Navigation Controllerや他のいくつかのアプローチを使用しようとしましたが、うまくいきませんでした。それを理解するのにしばらく時間を費やした後、この問題は、前のトランザクション(アニメーション)の進行中に(おそらく0.5秒程度)新し​​いビューコントローラーをプッシュしようとすると発生することに気付きました。とにかく、ナビゲーションコントローラーを委任し、以前のアニメーションの終了を待つことで、迅速な解決策を作りました。


ありがとうございました!ロジックをviewDidAppearに移動すると、状況が改善されました。
Jaroslav

7

-viewWillAppear、-viewDidAppear、-viewDidLoad、-viewWillDisappear、-viewDidDisappearを忘れずに、それらのメソッドのオーバーロードで適切なスーパーメソッドを呼び出すようにしてください。たとえば、私の場合、次のようにメソッド名を一致させていません。

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

予告現れる消える方法がされている不整合します


この問題のデバッグに約2時間を費やしただけで、これが実際の問題です。super.viewWillAppear()内で発信していますviewDidDisappear()
Daniel Wood

このヒントをありがとう。それは私の唯一の問題ではありませんでしたが、役に立ちました!
アンソニーC

4

「の外観遷移を開始/終了するための不均衡な呼び出し」

最後の関連するアニメーションが行われない前にアニメーションが開始されたと言います。それで、新しいものをプッシュする前にビューコントローラをポップしていますか?またはルートに飛び出る可能性がありますか?もしそうならアニメーションなしでそうしようとする、すなわち[self.navigationController popToRootViewControllerAnimated:NO];

これで問題が解決するかどうかを確認します。私の場合、これでうまくいきました。


1
これが重要です。他のビューコントローラのトランジションを同時にポップまたは変更します。
ロッキー

2

この問題が発生したのは、UITabbarがなく、UINavigationBarもない、viewControllerからUIPrintInteractionControllerを呼び出していたためです。UIPrintInteractionControllerが正しいprintInteractionControllerParentViewControllerを取得しなかったようです。デリゲートにメソッドを実装し、現在のrootViewControllerを返すのがうまくいきました。

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

モーダルダイアログの巻き戻しに関連する同様の問題がありました。ここにソリューションを投稿しました...

https://stackoverflow.com/a/38795258/324479

[問題]

Nav Controller-> VC1 -Push-> VC2 -PopOverまたはModal Segue-> VC3。

VC3はVC1に巻き戻されます。

VC2からVC3へのセグエがPopOverおよびModalの場合、巻き戻しは警告で終了します:UIViewControllerの外観遷移を開始/終了するための呼び出しのバランスが取れていません

VCからVCへのセグエがプッシュの場合、警告は表示されません。

[解決]

アンワインドロジックがこれを処理できれば素晴らしいと思います。多分それはバグかもしれませんが、そうではないかもしれません。どちらの方法でも、解決策はVC2(ポップアップを持つコントローラー)を巻き戻しのターゲットにし、それが表示されるのを待ってからナビゲーションコントローラーをポップアップすることです。これにより、巻き戻し(リバースポップアップ)アニメーションが終了するのに十分な時間があり、さらに後退することができます。アニメーションをオフにしても、待機する必要があります。そうしないと、エラーが発生します。

VC2のコードは次のようになります。(迅速)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

1

この状況は、モーダルビューコントローラーを含むビューをサブビューとして追加する場合に発生する可能性があります。使用に最適:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

基本的には、そのときに表示しようとしているそれらのviewControllersのビューライフサイクルは合理化されていません。


1

私がやろうとすると、同様の問題があります:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

のような関数で、関数の最後に- (void) popUpToLevelTwo;aを置くとreturn;問題が解決します


1

私もこれを手に入れました

[self dismissModalViewControllerAnimated:YES];

をに変更したYESところNO、問題は解決しました。


1

ナビゲーションコントローラーのpopメソッドを使用したときに同じ問題が発生するアプリでナビゲーションコントローラーに別のロジックを使用しているため、ナビゲーションバーの使用を避け、常に非表示にしています。次に、カスタムボタンと通知を使用して、戻るボタンとそのイベントを処理します。通知オブザーバーは登録されており、削除されません。そのため、通知が2回発生し、上記のエラーが発生します。そのような障害を取得するためにコードを徹底的にチェックしてください


1

それだけの価値があるので[super viewDidLoad:animated]viewDidLoadオーバーライドに呼び出しを含めないと、同じエラーが発生しました。


1
あなたはおそらくviewDidAppearを意味しますか?viewDidLoadにパラメーターはありません
Fabio Napodano

1

NIBからボタンをタップしたときにもこの問題が発生しました。ボタンを誤ってワイヤリングして2つのIBActionメソッドにイベントを送信したことがわかりました。それぞれがpushViewController:animatedを実行していました。


ありがとう!! あなたは私の時間を節約します!!
VD

1

UIViewControllerすべてのデータがダウンロードされるまでプッシュを待機するロジックを実装しました。このロジックにエラーがありUIViewController、進行中の別のAPI呼び出しがまだある間に、早すぎるプッシュを引き起こしました。

これUIViewControllerによりによって2回プッシュされ、UINavigationControllerこの警告が出されました。


1

メッセージの理由:あなたがから別のビューコントローラを提示/推進している場合にのみ、このメッセージが表示されますviewWillAppearloadViewinitまたはviewDidLoad現在のビューコントローラのメソッド

エラーメッセージを削除するviewDidAppear方法プッシュ/プレゼンテーションコードをメソッドに移動すると、問題が解決します


1

スウィフト4

私の問題は、現在のVCのレンダリングが完了する前に別のVCを提示していたことでした。

解決策は、少し遅れて私の次のVCを提示することでした。

してはいけないこと

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

あなたがすべきこと

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
遅延を使用するのではなく、コードをviewDidAppearまたはviewDidLayoutSubviewsに配置します。
Pranav Kasetti、

0

Breakの設定を忘れたときにこの問題が発生しました。switchステートメントでビューをプッシュした後!

ここのような:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

「外観の遷移を開始/終了するための呼び出しのバランスが取れていません」というエラーの背後にある理由は、ナビゲートするときです。同時に2回セグエする


0

1つの解決策は、

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

ロードが完了する前にUIViewControllerを閉じようとすると、この問題が発生する可能性があります。

コンソールにこのメッセージが表示され、新しいUIViewControllerを提示していたUIViewControllerに完全に集中していたが、成功しなかった。ユーザーが自分のアカウントにログインしていなかったため、提示していたUIViewControllerに問題があることをようやく見つけました。

これが誰かを助けることを願っています。


0

これは私にとって難しいものでした:私は上書きしました

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

上書きせずに:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

私のウィンドウルートナビゲーションコントローラで。次に、上記の警告で別のビューコントローラーを押すと、子ナビゲーションコントローラーが不平を言いました。警告は最悪ではなく、大きな問題は、子ナビゲーションコントローラのデリゲートが呼び出されなくなったことでした。奇妙な。


0

私の場合、「」メソッドの内部NSDataからフェッチしNSURLていましたviewDidLoad

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.