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

时间:2010-10-30 00:19:27

标签: iphone objective-c cocoa-touch uiviewcontroller viewwillappear

我发现当我的程序启动时,在我的一个viewcontrollers中,调用的顺序是viewDidAppearviewWillAppearviewDidAppear

我没想到要调用第一个viewDidAppear。可能导致这种情况的原因以及如何解决? ATM我在viewDiDAppear有一个标志,用于检查viewWillAppear是否被调用,但这是一个黑客攻击。

stacktrace(在bot调用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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

在viewDidAppear中放置一个断点,然后检查调试器中的调用堆栈。它会告诉你调用该方法的内容。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

你很可能想要viewDidLoad而不是viewDidAppear的行为 - 当你不期望它时,你的ViewController可以多次调用viewDidAppear。