看起来这个话题出现了很多。我阅读了几个答案,但没有一个与我的情况相同,所以如果您以前见过类似的情况,请原谅。
我所有的 UIViewControllers 都由 UINavgationController 控制。在第一个 UIViewController (SMOnboardingPhotoMarketingViewController) 上,我调用我的钥匙串包装类来查看是否有人登录(应用程序恢复)。如果是这样,我调用 segue 转到我的主登录屏幕 (SMThumbnailViewController),我在其中收到错误消息:不平衡调用开始/结束外观转换。
我检查了所有视图控制器生命周期调用,以确保如果我过度使用它们,我正在调用[超级方法]。完毕。
除此之外,这只是所有转换的标准推送类型segue。我不明白这个对 segue 的调用与由按钮操作触发的所有其他调用有何不同。这是我的第一个视图控制器的代码:
-(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。什么会导致这种不平衡?
编辑:添加信息。如果我将 segue 调用移到该块的外部,我应该声明,转换会正常进行,没有错误。例子:
// 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];
}
}