この話題はよく出ているようです。私はいくつかの回答を読みましたが、私のものと同じケースはありませんでした。
私の UIViewControllers はすべて UINavgationController によって制御されています。最初の UIViewController (SMOnboardingPhotoMarketingViewController) で、キーチェーン ラッパー クラスを呼び出して、ログインしているユーザー (アプリの再開) があるかどうかを確認します。その場合、セグエを呼び出してメインのログイン画面 (SMThumbnailViewController) に移動すると、エラー メッセージが表示されます。
ビュー コントローラーのライフサイクル呼び出しをすべて調べて、オーバーロードした場合に [スーパー メソッド] を呼び出していることを確認しました。終わり。
それ以外は、すべてのトランジションの標準的なプッシュ型セグエです。このセグエの呼び出しと、ボタン アクションによってトリガーされる他のすべての呼び出しとの違いがわかりません。最初のView Controllerのコードは次のとおりです。
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self loadScrollViewContent];
__weak SMOnboardingPhotoMarketingViewController *weakSelf = self;
[SMAuthentication validateStoredTokenWithCompletion:^(BOOL valid) {
if(valid){
NSLog(@"Logged in. Continue to thumbs page");
[weakSelf performSegueWithIdentifier:kSeguePhotoMarketingToThumbnails sender:self];
}
else{
[SMAuthentication logOut];
NSLog(@"invalid credentials stored. User must log in ");
}
}];
}
私のメイン ビュー コントローラー (上記のコードが移動するコントローラー) では、viewDidLoad が呼び出されますが、viewDidAppear は呼び出されないことに気付きました。何がそのような不均衡を引き起こす可能性がありますか?
編集:情報を追加します。セグエ呼び出しをそのブロックの外側に移動すると、遷移はエラーなしで正常に行われます。例:
// I know this is ugly. It is for testing only
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self loadScrollViewContent];
__block BOOL complete = NO;
__block BOOL isValid = NO;
[SMAuthentication validateStoredTokenWithCompletion:^(BOOL valid) {
if(valid){
NSLog(@"Logged in. Continue to thumbs page");
isValid = YES;
}
else{
[SMAuthentication logOut];
NSLog(@"invalid tokens stored. User must log in ");
}
complete = YES;
}];
while (!complete) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
if(isValid){
[self performSegueWithIdentifier:kSeguePhotoMarketingToThumbnails sender:self];
}
}