エラーや警告ではなくアプリをシミュレートするときにこの問題が発生しますが、コンソールに表示されます。これを経験したことはありますか?
私の場合、TableViewの2つのタブをクリックすると、このエラーが非常に速く発生します。
その結果、間違ったタイトル名が表示され、戻るボタンが消えます。誰かがビューをプッシュすると、set animated:NO
と言いました。エラーは消えますが、それでも奇妙な動作を引き起こします。 2つのビューをプッシュするので、TableView画面に戻るには2回戻る必要があります。
この問題を解決するために試した方法:
BOOL cellSelected;
を追加
viewWillAppear
cellSelected = YES;
didselectcellデリゲートif (cellSelected){cellSelected = NO; do action ; }
これにより、2つの異なるセルが非常に速くクリックされるのを防ぐことができます。
私の場合、UINavigationController
アイテムのviewDidLoad
メソッド内で[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
をトリガーしたときに発生しました。
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];
});
同じ問題に多くの問題がありました。これで解決しました
1)UIViewController's
指定イニシャライザーinitWithNibName:bundle:
を使用していません。 init
の代わりに使用してみてください。
2)animated:YES
をNOに設定すると、問題は解決しました。例えば。 [self.navigationController pushViewController: viewController_Obj animated:NO];
-viewWillAppear、-viewDidAppear、-viewDidLoad、-viewWillDisappear、-viewDidDisappearを忘れずに、そのメソッドのオーバーロードで適切なスーパーメソッドを呼び出すようにしてください。たとえば、私の場合、次のようにメソッド名が一致していません。
-(void)viewDidAppear
{
[super viewDidDisappear];
//some code staff
..
}
appearおよびdisappearメソッドはmismatchedであることに注意してください
ナビゲーションコントローラーを使用して他のコントローラーをプッシュするのと同じ問題がありました。 Buffered Navigation Controller および他のいくつかのアプローチを使用しようとしましたが、うまくいきませんでした。それを理解するためにしばらく時間を費やした後、前のトランザクション(アニメーション)の進行中に新しいView Controllerをプッシュしようとすると、この問題が発生することに気付きました(約0.5秒の継続時間)。とにかく、私はNavigation Controllerを委任し、前のアニメーションが終了するのを待つという簡単な解決策を作りました。
「外観の遷移を開始/終了するための不均衡な呼び出し」
最後の関連するアニメーションが完了しないうちに、アニメーションが開始されると言います。だから、あなたは新しいものをプッシュする前にView Controllerをポップしていますか?または、ルートにポップすることがありますか?はいの場合、アニメーションなしで試してみてください[self.navigationController popToRootViewControllerAnimated:NO];
これで問題が解決するかどうかを確認してください。私の場合、これでうまくいきました。
メッセージの理由: このメッセージは、現在のView ControllerのviewWillAppear
、loadView
、init
またはviewDidLoad
メソッドから別のView Controllerをプッシュ/プレゼンテーションする場合にのみ表示されます
エラーメッセージを削除する方法: プッシュ/プレゼンテーションコードをviewDidAppear
メソッドに移動すると問題が解決します
モーダルダイアログの巻き戻しを伴う同様の問題がありました。ここにソリューションを投稿しました...
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)
}
}
}
UITabbarなしでUINavigationBarなしのviewControllerからUIPrintInteractionControllerを呼び出していたため、この問題が発生しました。 UIPrintInteractionControllerが正しいprintInteractionControllerParentViewControllerを取得しなかったようです。デリゲートでメソッドを実装し、現在のrootViewControllerを返すことは私のために働いた。
- (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;
この状況は、モーダルビューコントローラーを含むビューをサブビューとして追加している場合に発生する可能性があります。最適な使用方法:
-(void) viewDidAppear:(BOOL)animated {
[self presentViewController:self.yourModalVC animated:YES completion:nil];
}
基本的に、表示しようとしているviewControllerのビューライフサイクルが合理化されていないということです。
価値があるのは、viewDidLoad
オーバーライドに[super viewDidLoad:animated]
への呼び出しを含めない場合に、同じエラーが発生したことです。
私がやろうとすると同様の問題があります:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
- (void) popUpToLevelTwo;
のような関数で、関数の最後にreturn;
を置くと問題が解決します
私もこれを得た
[self dismissModalViewControllerAnimated:YES];
YES
をNO
に変更し、問題を解決しました。
NIBからボタンをタップしたときにもこの問題が発生しました。誤って2つのIBActionメソッドにイベントを送信するためにボタンを配線していたことがわかりました。各メソッドはpushViewController:animatedを実行しました。
すべてのデータがダウンロードされるまでUIViewController
をプッシュするのを待つためのロジックを実装しました。このロジックにエラーがあり、UIViewController
のプッシュが早すぎて、別のAPI呼び出しが進行中でした。
同じUIViewController
がUINavigationController
によって2回プッシュされ、この警告が出されました。
navigationControllerのpopメソッドを使用すると、同じ問題が発生します。アプリではNavigation Controllerに別のロジックを使用するため、Navigation Barの使用を避け、常に非表示になります。次に、バックボタンとそのイベントの処理にカスタムビューと通知を使用します。通知オブザーバーは登録されており、削除されていません。そのため、通知は2回起動され、上記のエラーが作成されます。そのような障害を取得するためにコードを徹底的に確認してください
私の場合、 'NSData
'メソッド内のNSURL
からviewDidLoad
を取得していました。
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];
ロードが完了する前にUIViewControllerを閉じようとすると、これに遭遇する可能性があります。
コンソールにこのメッセージがあり、新しいUIViewControllerを提示していたUIViewControllerに完全に焦点を当てていましたが、成功しませんでした。ユーザーがアカウントにログインしていなかったため、私が提示していたUIViewControllerに問題があることを最終的に発見しました。
これが誰かを助けることを願っています。
「外観の移行を開始/終了するための不均衡な呼び出し」というエラーの原因は、ナビゲートしたときです。同時に2回セグエ
これは私にとって難しいものでした:私はオーバーライドしました
override func shouldAutomaticallyForwardRotationMethods() -> Bool {
return true
}
オーバーライドすることなく:
override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
return true
}
私のウィンドウのルートナビゲーションコントローラーで。次に、上記の警告で別のView Controllerをプッシュすると、子Navigation Controllerが苦情を言いました。警告は最悪ではなく、大きな問題は、子ナビゲーションコントローラーのデリゲートが呼び出されなくなったことです。おかしい。
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)
}