web-dev-qa-db-ja.com

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

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

91
C.Johns

私の場合、TableViewの2つのタブをクリックすると、このエラーが非常に速く発生します。

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

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

BOOL cellSelected;を追加

viewWillAppearcellSelected = YES;

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

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

48
chings228

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

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

viewDidLoadではすべてが完了しているのに対し、viewDidAppearではすべての派手なアニメーションが既に終了しているわけではない可能性が非常に高いです。

42
tttthomasssss

私にもこの問題があります。この問題に対する2つの解決策を見つけました。

  1. 上記のソリューションをご覧ください。
  2. この問題が解決したUINavigationControllerからサブクラスを見つけました。 バッファナビゲーションコントローラー
21

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

 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];
        });
15
prohuutuan

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

1)UIViewController's指定イニシャライザーinitWithNibName:bundle:を使用していません。 initの代わりに使用してみてください。

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

12
kunalg

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

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

appearおよびdisappearメソッドはmismatchedであることに注意してください

7

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

7
dimanitm

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

最後の関連するアニメーションが完了しないうちに、アニメーションが開始されると言います。だから、あなたは新しいものをプッシュする前にView Controllerをポップしていますか?または、ルートにポップすることがありますか?はいの場合、アニメーションなしで試してみてください[self.navigationController popToRootViewControllerAnimated:NO];

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

3
infiniteLoop

メッセージの理由: このメッセージは、現在のView ControllerのviewWillAppearloadViewinitまたはviewDidLoadメソッドから別のView Controllerをプッシュ/プレゼンテーションする場合にのみ表示されます

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

2
Mehul Thakkar

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

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(ポップアップのあるコントローラー)を巻き戻しのターゲットにし、表示が完了するのを待ってからnavコントローラーをポップアップすることです。これにより、巻き戻し(逆ポップアップ)アニメーションがさらに戻る前に終了するのに十分な時間が確保されます。アニメーションをオフにしても、待機する必要があります。そうしないと、エラーが発生します。

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)
        }
    }
}
2
Carter Medlin

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

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

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

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

基本的に、表示しようとしているviewControllerのビューライフサイクルが合理化されていないということです。

1
elliotrock

価値があるのは、viewDidLoadオーバーライドに[super viewDidLoad:animated]への呼び出しを含めない場合に、同じエラーが発生したことです。

1
raeldor

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

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

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

1
BabyPanda

私もこれを得た

[self dismissModalViewControllerAnimated:YES];

YESNOに変更し、問題を解決しました。

1
DD.amor

NIBからボタンをタップしたときにもこの問題が発生しました。誤って2つのIBActionメソッドにイベントを送信するためにボタンを配線していたことがわかりました。各メソッドはpushViewController:animatedを実行しました。

1
Martin Lockett

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

同じUIViewControllerUINavigationControllerによって2回プッシュされ、この警告が出されました。

1
Jasper

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

1
Dileep stanley

私の場合、 'NSData'メソッド内のNSURLからviewDidLoadを取得していました。

0
BhushanVU

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
Alex McPherson

1つの解決策は、

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

ロードが完了する前にUIViewControllerを閉じようとすると、これに遭遇する可能性があります。

コンソールにこのメッセージがあり、新しいUIViewControllerを提示していたUIViewControllerに完全に焦点を当てていましたが、成功しませんでした。ユーザーがアカウントにログインしていなかったため、私が提示していたUIViewControllerに問題があることを最終的に発見しました。

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

0
Mark Hennings

「外観の移行を開始/終了するための不均衡な呼び出し」というエラーの原因は、ナビゲートしたときです。同時に2回セグエ

0
poa

これは私にとって難しいものでした:私はオーバーライドしました

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

オーバーライドすることなく:

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

私のウィンドウのルートナビゲーションコントローラーで。次に、上記の警告で別のView Controllerをプッシュすると、子Navigation Controllerが苦情を言いました。警告は最悪ではなく、大きな問題は、子ナビゲーションコントローラーのデリゲートが呼び出されなくなったことです。おかしい。

0
heiko

Swift 4

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

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

あなたがすべきでないこと

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)
}
0
Ugo Marinelli