不存在的View Controller调用viewDidAppear

时间:2011-11-14 22:55:15

标签: iphone objective-c uinavigationcontroller modalviewcontroller viewdidappear

我有一个我重复用于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 ...)

2 个答案:

答案 0 :(得分:0)

我不确定为什么会这样,但我认为最好在导航控制器上调用popToRootViewController:NO来重置它,而不是手动修改它的viewControllers数组。

试一试,看看它是否还有问题。

答案 1 :(得分:0)

正如你所说

  

每当我退出时,我都会重置navigationController的viewControllers   数组到单个Splash屏幕。

这表示您再次设置navigationController的viewControllers而不是NavigationController本身。

之所以发生这种情况,是因为无论何时我们将新的viewcontroller数组放在导航堆栈中,在释放早期的viewcontroller之前,它都会调用它们的视图外观方法。

我遇到了同样的问题。我再次创建了navigationController而不是重用旧的(我发布了它)。

谢谢,