【问题标题】:iOS: Handle invalid session in App DelegateiOS:在 App Delegate 中处理无效会话
【发布时间】:2014-09-04 01:29:23
【问题描述】:

我目前正在开发一个需要身份验证的 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];
}

但是当我这样做时,我收到以下错误:

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

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

有没有想过我在这里做错了什么?谢谢!

【问题讨论】:

  • 你的第一个sn-p里面是什么方法?
  • 在我的一个视图控制器中。这是在我从数据管理器返回网络结果之后。
  • 传递 NO 并不能解决问题。我会四处逛逛

标签: ios objective-c iphone session delegates


【解决方案1】:

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

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

P.s:由于您必须在检查会话之前完成视图的显示,我认为提及过期会话的弹出窗口可能对您的 UI 来说是整洁的。

【讨论】:

  • 是的,在调用 viewDidAppear 之前弹出视图是个问题。我已经用你的方法修复了它。谢谢!
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 2014-02-09
  • 2016-10-30
  • 1970-01-01
  • 2020-11-24
  • 2015-04-25
  • 2017-06-04
  • 1970-01-01
相关资源
最近更新 更多