我有一个导航控制器,可重复用于我的启动画面。每当我注销时,我都会将 navigationController 的 viewControllers 数组重置为单个启动画面。但是我得到了一些奇怪的行为。
脚步:
Splash 出现 - 模态显示,navigationController 与单个 Splash viewController 作为根选择“登录” - 登录视图推送到导航控制器
输入信息、提交、成功、关闭模态视图
浏览应用程序....然后再次注销
用新制作的 viewController (Splash) 替换 modal navigationController 的 viewControllers (当前为 Splash -> Sign In)。
呈现模态视图控制器
意外行为**
原始“登录”视图控制器的 viewDidAppear 方法被调用。
除了调用“登录”视图控制器的 viewDidAppear 之外,一切都正常。新的 Splash 出现了,我可以推送新的登录,没问题。一切照常进行。
我的 viewDidAppear 中有一个 NSNotificationCenter addObserver,所以这个额外的 viewDidAppear 被调用会抛出应用程序中的其他行为,这就是为什么我需要弄清楚它来自哪里并修复它。
回溯在错误的“viewDidAppear”处暂停
Thread 1, Queue : (null)
0 0x000f1881 in -[KeyboardViewController viewDidAppear:] at /Users/Me/App/Classes/KeyboardViewController.m:69
1 0x00d79fbf in -[UIViewController _setViewAppearState:isAnimating:] ()
2 0x00d7a2d4 in -[UIViewController __viewDidAppear:] ()
3 0x00d7b8c9 in __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke_0 ()
4 0x00d7a730 in -[UIViewController _executeAfterAppearanceBlock] ()
5 0x00cc35ea in _afterCACommitHandler ()
6 0x01dfa9ce in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
7 0x01d91670 in __CFRunLoopDoObservers ()
8 0x01d5d4f6 in __CFRunLoopRun ()
9 0x01d5cdb4 in CFRunLoopRunSpecific ()
10 0x01d5cccb in CFRunLoopRunInMode ()
11 0x0261b879 in GSEventRunModal ()
12 0x0261b93e in GSEventRun ()
13 0x00cb2a9b in UIApplicationMain ()
14 0x000028d9 in main ()
如果我在关闭它之前在 navigationController 中弹出ToRootViewController,这个问题就会消失。但是,如果我等待 0.5 秒并在 navigationController 已经关闭后关闭,问题仍然存在。理想情况下,我不想 popToRootViewController 在解雇时...
然后,当我在关闭之前调用 popToRootViewController 时,没有调用 viewDidDisappear 方法......现在,我有一个 hack 可以拍摄当前 viewController 堆栈的快照,替换它们,加载视图,然后遍历存储的控制器堆栈,撤消在 viewDidAppear 方法中运行的代码(NSNotification 的东西......)