アプリをシミュレートするとこの問題が発生します。エラーや警告ではありませんが、コンソールに表示されます。これまでにこれを経験したことはありますか?
アプリをシミュレートするとこの問題が発生します。エラーや警告ではありませんが、コンソールに表示されます。これまでにこれを経験したことはありますか?
回答:
私の場合、このエラーは、テーブルビューで2つのタブを非常に速くクリックしたときに発生します。
結果は間違ったタイトル名を引き起こし、戻るボタンが消えます。誰かがあなたがビューを押すとき、と述べましたset animated:NO
。エラーは消えますが、それでもいくつかの奇妙な動作を引き起こします。2つのビューをプッシュするため、tableview画面に戻るには2回戻る必要があります。
この問題を解決するために試した方法:
追加 BOOL cellSelected;
に viewWillAppear
cellSelected = YES;
didselectcellデリゲート if (cellSelected){cellSelected = NO; do action ; }
これにより、2つの異なるセルが非常に速くクリックされるのを防ぐことができます。
私の場合[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
、UINavigationController
アイテムのviewDidLoad
メソッド内でトリガーしたときに発生 しました。
viewDidAppear
メソッドに移動することで問題は解決しました。
可能性が非常に高いのは、viewDidLoad
すべてのファンシーアニメーションが既に完了しているわけではなく、すべてが完了しているviewDidAppear
ためです。
私にもこの問題があります。この問題に対する2つの解決策が見つかりました。
UINavigationController
この問題が解決された場所からサブクラスを見つけました。バッファードナビゲーションコントローラーこれを回避するには、コードを別のループで実行する必要があります
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];
});
dispatch_async
をメインキューの中に入れることです。事は、dispatch_async
メインキュー上の他のすべてのアニメーションが完了するまで、それは待つということです。次の理由により、遅延を使用するよりもはるかに優れています。1-遅延が十分であるかどうかは決してわからない、それはホストデバイスに依存します2-遅延をやりすぎてしまい、何かが遅れます。これを試してください:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
ナビゲーションコントローラーを使用して同じ問題が発生し、他のコントローラーをプッシュしました。Buffered Navigation Controllerや他のいくつかのアプローチを使用しようとしましたが、うまくいきませんでした。それを理解するのにしばらく時間を費やした後、この問題は、前のトランザクション(アニメーション)の進行中に(おそらく0.5秒程度)新しいビューコントローラーをプッシュしようとすると発生することに気付きました。とにかく、ナビゲーションコントローラーを委任し、以前のアニメーションの終了を待つことで、迅速な解決策を作りました。
-viewWillAppear、-viewDidAppear、-viewDidLoad、-viewWillDisappear、-viewDidDisappearを忘れずに、それらのメソッドのオーバーロードで適切なスーパーメソッドを呼び出すようにしてください。たとえば、私の場合、次のようにメソッド名を一致させていません。
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
予告現れると消える方法がされている不整合します
super.viewWillAppear()
内で発信していますviewDidDisappear()
。
「の外観遷移を開始/終了するための不均衡な呼び出し」
最後の関連するアニメーションが行われない前にアニメーションが開始されたと言います。それで、新しいものをプッシュする前にビューコントローラをポップしていますか?またはルートに飛び出る可能性がありますか?もしそうならアニメーションなしでそうしようとする、すなわち[self.navigationController popToRootViewControllerAnimated:NO];
これで問題が解決するかどうかを確認します。私の場合、これでうまくいきました。
この問題が発生したのは、UITabbarがなく、UINavigationBarもない、viewControllerからUIPrintInteractionControllerを呼び出していたためです。UIPrintInteractionControllerが正しいprintInteractionControllerParentViewControllerを取得しなかったようです。デリゲートにメソッドを実装し、現在のrootViewControllerを返すのがうまくいきました。
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
モーダルダイアログの巻き戻しに関連する同様の問題がありました。ここにソリューションを投稿しました...
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)
}
}
}
ナビゲーションコントローラーのpopメソッドを使用したときに同じ問題が発生するアプリでナビゲーションコントローラーに別のロジックを使用しているため、ナビゲーションバーの使用を避け、常に非表示にしています。次に、カスタムボタンと通知を使用して、戻るボタンとそのイベントを処理します。通知オブザーバーは登録されており、削除されません。そのため、通知が2回発生し、上記のエラーが発生します。そのような障害を取得するためにコードを徹底的にチェックしてください
それだけの価値があるので[super viewDidLoad:animated]
、viewDidLoad
オーバーライドに呼び出しを含めないと、同じエラーが発生しました。
NIBからボタンをタップしたときにもこの問題が発生しました。ボタンを誤ってワイヤリングして2つのIBActionメソッドにイベントを送信したことがわかりました。それぞれがpushViewController:animatedを実行していました。
スウィフト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)
}
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:
1つの解決策は、
[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];
これは私にとって難しいものでした:私は上書きしました
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
上書きせずに:
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
私のウィンドウルートナビゲーションコントローラで。次に、上記の警告で別のビューコントローラーを押すと、子ナビゲーションコントローラーが不平を言いました。警告は最悪ではなく、大きな問題は、子ナビゲーションコントローラのデリゲートが呼び出されなくなったことでした。奇妙な。