viewDidAppear调用两次,但viewWillAppear调用一次

问题描述:

我发现当我的程序启动时,在我的一个视图控制器中,调用顺序是viewDidAppear,viewWillAppear,viewDidAppearviewDidAppear调用两次,但viewWillAppear调用一次

我并不期待第一个viewDidAppear被调用。有什么可能导致这种情况,我该如何解决?自动取款机我在viewDiDAppear有一个标志来检查是否叫viewWillAppear,但它是一个黑客。

的堆栈跟踪(这是在机器人调用viewDidAppear相同)为:

#0 0x0000509e in -[MainView viewDidAppear:] at MainView.m:497 
#1 0x3097e96e in -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] 
#2 0x30af3abe in -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] 
#3 0x30af4930 in -[UINavigationTransitionView _navigationTransitionDidStop] 
#4 0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
#5 0x3091ba9e in +[UIViewAnimationState popAnimationState] 
#6 0x30af46fd in -[UINavigationTransitionView transition:fromView:toView:] 
#7 0x30af3b01 in -[UINavigationTransitionView transition:toView:] 
#8 0x30979f09 in -[UINavigationController _startDeferredTransitionIfNeeded] 
#9 0x30a97d9c in -[UILayoutContainerView layoutSubviews] 
#10 0x0040bd94 in -[CALayer layoutSublayers] 
#11 0x0040bb55 in CALayerLayoutIfNeeded 
#12 0x0040b3ae in CA::Context::commit_transaction 
#13 0x0040b022 in CA::Transaction::commit 
#14 0x308f942a in -[UIApplication _reportAppLaunchFinished] 
#15 0x308fef33 in -[UIApplication handleEvent:withNewEvent:] 
#16 0x308fad82 in -[UIApplication sendEvent:] 
#17 0x309013e1 in _UIApplicationHandleEvent 
#18 0x32046375 in PurpleEventCallback 
#19 0x30245560 in CFRunLoopRunSpecific 
#20 0x30244628 in CFRunLoopRunInMode 
#21 0x308f930d in -[UIApplication _run] 
#22 0x309021ee in UIApplicationMain 
#23 0x00001e82 in main at main.m:14 
+0

你能分享你的视图层次吗?什么是添加到窗口? UINavigationController中的rootViewController是什么? etc – 2010-10-30 20:32:47

+0

分享一些代码。检查viewWillAppear方法的拼写错误。 – coneybeare 2012-07-25 12:38:21

放入viewDidAppear一个断点,然后检查在调试器调用堆栈。它会告诉你什么是调用方法。

+0

我已经做到了,但它们都来自main,尤其是UIApplicationMain(...) – 2010-10-30 00:43:49

+0

为什么不在这里添加堆栈跟踪。 – coneybeare 2010-10-30 04:10:16

+0

请在此处添加堆栈跟踪,是 – Fab1n 2012-07-25 11:42:39

很可能你想要viewDidLoad的行为而不是viewDidAppear - viewDidAppear可以在你不期待的时候被ViewController多次调用。

+0

否。我想要viewDidAppear。你没有回答我问的问题。再次说明:为什么viewDidAppear被调用时没有相应的viewWillAppear? – 2010-10-30 02:21:09

当调用viewDidAppear时,是否可以通过以下方法取消事件队列中的另一个viewDidAppear?有时我会用这个来避免一些方法被调用两次或更多次。

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(viewDidAppear) object:nil]; 

我刚碰到一个非常类似的问题。 在我的情况,这是因为ECSlidingViewController(https://github.com/edgecase/ECSlidingViewController)的错误。 我刚从github更新了代码,解决了这个问题。

在uikit navigationController的顶部使用一个ECSlidingViewController,使孩子的viewDidAppear调用两次。