【问题标题】:viewDidAppear called twice, but viewWillAppear called onceviewDidAppear 调用了两次,但是 viewWillAppear 调用了一次
【发布时间】:2010-10-30 00:19:27
【问题描述】:

我发现当我的程序启动时,在我的一个视图控制器中,调用顺序是viewDidAppearviewWillAppearviewDidAppear

我没想到会调用第一个 viewDidAppear。可能是什么原因造成的,我该如何解决? ATM 我在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

【问题讨论】:

  • 您能分享您的视图层次结构吗?窗口中添加了什么? UINavigationController 中的 rootViewController 是什么?等
  • 分享一些代码。检查 viewWillAppear 方法的拼写错误。

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


【解决方案1】:

我刚刚遇到了一个非常相似的问题。 就我而言,这是因为 ECSlidingViewController (https://github.com/edgecase/ECSlidingViewController) 的一个错误。 我刚刚从github更新了代码,解决了这个问题。

在uikit navigationController 之上使用ECSlidingViewController,使孩子的viewDidAppear 被调用了两次。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我已经做到了,但它们都来自 main,特别是 UIApplicationMain(...)
    • 为什么不在这里添加堆栈跟踪。
    • 请在此处添加堆栈跟踪,是的
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 没有。我想要 viewDidAppear。你没有回答我问的问题。再次:为什么在没有相应的 viewWillAppear 的情况下调用 viewDidAppear?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多