我有一个我重复用于Splash屏幕的navigationController。每当我退出时,我都会将navigationController的viewControllers数组重置为单个Splash屏幕。但是我有一些奇怪的行为。
步骤:
Splash出现 - 模态显示,navigationController以单个Splash viewController为根 选择“登录” - 登录视图将推送到导航控制器
输入信息,提交,成功,撤消模式查看
浏览应用程序....然后再次注销
使用新制作的viewController(Splash)替换modal navigationController的viewControllers(当前为Splash - > Sign In)。
目前的Modal ViewController
意外行为**
原始“登录”视图控制器的viewDidAppear方法被调用。
除了“登录”视图控制器的viewDidAppear被调用之外,一切都表现得正常。新的Splash出现了,我可以推出一个新的登录,没问题。一切都继续正常。
我的viewDidAppear中有一个NSNotificationCenter addObserver,所以调用这个额外的viewDidAppear会在应用程序中丢弃行为,这就是为什么我需要弄清楚它来自何处并修复它。
Backtrace暂停错误的“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中使用popToRootViewController,则此问题就会消失。但是,如果我等待.5秒并且一旦navigationController已经被解除则解雇,问题仍然存在。理想情况下,我不想popToRootViewController在它解雇时...
然后当我在解雇之前调用popToRootViewController时,viewDidDisappear方法没有被调用...现在,我有一个hack到位,它获取当前viewControllers堆栈的快照,替换它们,加载查看,然后迭代存储的控制器堆栈,撤消在viewDidAppear方法中运行的代码(NSNotification stuff ...)
答案 0 :(得分:0)
我不确定为什么会这样,但我认为最好在导航控制器上调用popToRootViewController:NO
来重置它,而不是手动修改它的viewControllers数组。
试一试,看看它是否还有问题。
答案 1 :(得分:0)
正如你所说
每当我退出时,我都会重置navigationController的viewControllers 数组到单个Splash屏幕。
这表示您再次设置navigationController的viewControllers而不是NavigationController本身。
之所以发生这种情况,是因为无论何时我们将新的viewcontroller数组放在导航堆栈中,在释放早期的viewcontroller之前,它都会调用它们的视图外观方法。
我遇到了同样的问题。我再次创建了navigationController而不是重用旧的(我发布了它)。
谢谢,