【问题标题】:iOS SideMenu v3.1.4 calls lifecycle methods out of orderiOS SideMenu v3.1.4 乱序调用生命周期方法
【发布时间】:2018-04-20 12:09:30
【问题描述】:

我在我的应用程序中成功使用 SideMenu 2.3.4,然后升级到 v3.1.4。我做了一些调整以适应 API 更改所需的模块,然后运行我的应用程序 - 它在以下 UI 操作后崩溃:

  1. 点击导航栏按钮打开菜单
  2. 点击加载另一个视图的项目(菜单关闭,新视图出现)
  3. 点击导航栏按钮再次打开菜单

在应用崩溃之前,菜单没有响应最后一次点击而打开。在调试器下,我看到在 2 之后,为该新视图调用了 viewDidLoad 然后 viewWillAppear。 3 之后,调用了同一个视图的viewWillDisappear、viewDidDisappear 和viewWillAppear,显示没有任何变化。

崩溃发生在 viewWillAppear 中,因为我的代码认为 viewDidLoad 是在 viewDidDisappear 之后调用的第一件事。 AFAIK,依靠它是合法的,因为 viewDidDisappear 应该意味着视图已关闭,因此必须重新加载并在调用任何其他生命周期方法之前调用 viewDidLoad ,即之前不应调用 viewWillAppear viewDidLoad。

我是否误解了 iOS 视图生命周期?这是 SideMenu 3.1.4 中的错误吗?

谢谢,

标记

【问题讨论】:

  • 您可以考虑在dealloc 方法中添加一些代码,以确定您的视图控制器是否正在从内存中删除。如果它仍在内存中,则不会再次调用viewDidLoad,因为视图已“加载”,只是不再显示在屏幕上。 (此处记录了 Swift Dealloc:developer.apple.com/library/content/documentation/Swift/…

标签: ios swift


【解决方案1】:

仔细阅读网上的文档和文章表明我确实误解了生命周期方法。

viewDidLoad 没有对立面(例如 viewDidUnload),但在 viewDidDisappear 中可以这样做:

if (isBeingDismissed || isMovingFromParentViewController) {
    // Do something - viewWillAppear will NOT be called before viewDidLoad.
}

这消除了我看到的崩溃。

标记

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多