iOS:处理应用程序委托中的无效会话

iOS:处理应用程序委托中的无效会话,ios,objective-c,iphone,session,delegates,Ios,Objective C,Iphone,Session,Delegates,我目前正在开发一个需要身份验证的iOS应用程序。当发生无效会话时,我无法转换到登录视图 我处理这个问题的方法是通知应用程序代理会话已无效;然后,应用程序代表将用户带到登录屏幕 在我的当前视图控制器中,我有以下代码逻辑来检测无效会话: if (responseCode == INVALID_AUTHORIZATION) { AppDelegate *appdelegate = (AppDelegate *)([UIApplication sharedApplication].delegat

我目前正在开发一个需要身份验证的iOS应用程序。当发生无效会话时,我无法转换到登录视图

我处理这个问题的方法是通知应用程序代理会话已无效;然后,应用程序代表将用户带到登录屏幕

在我的当前视图控制器中,我有以下代码逻辑来检测无效会话:

if (responseCode == INVALID_AUTHORIZATION) {
    AppDelegate *appdelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
    [appdelegate invalidateSession];
    return;
}
在我的应用程序委托中,我通过将用户带到根控制器来处理无效授权

- (void) invalidateSession {
    UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
    [navController popToRootViewControllerAnimated:YES];
}
但当我这样做时,我会得到以下错误:

开始/结束外观转换的调用不平衡

正在以意外状态完成导航转换。导航栏子视图树可能已损坏


有没有想过我做错了什么?谢谢

我认为您不应该在AppDelegate中实现pop-push转换,因为在弹出视图控制器之前,您无法确定上一个转换是否已完成,这导致了上述问题

如果您必须在多个屏幕中检查会话,我建议实现一个“超级”视图控制器,该控制器具有一个名为
checkSession
的方法,您可以在其中执行检查,并在必要时弹出视图控制器。应该在
viewdideappear
中调用此方法,以便确保在调用
poptrootviewcontroller
时没有未完成的转换。然后,您需要使所有需要验证子类的视图控制器都成为超级视图控制器,这样就可以了。我希望这对你有用


注意:由于您必须在检查会话之前完成视图的显示,我认为可能会弹出一个提示已过期会话的弹出窗口,这对于您的UI来说是一个不错的选择。

在我的一个视图控制器中,您的第一个片段是什么方法。这是在我从数据管理器获得网络结果之后。传递“否”不能解决问题。我会四处看看是的,在调用viewdide之前弹出视图是个问题。我已经用你的方法解决了。谢谢