【问题标题】:prepareForSegue called before viewDidLoad在 viewDidLoad 之前调用 prepareForSegue
【发布时间】:2014-07-16 10:13:11
【问题描述】:

我尝试过 SO 和 Google 的座位,但似乎没有人遇到过这个问题。

我的 iOS 应用中有两个 ViewControllers

viewControllerA 我调用的点击事件中:

[self performSegueWithIdentifier:@"fooSegue" sender:self];

这叫什么:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

viewControllerA

那里没问题。

但是在那个方法之后,

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

在调用 viewDidLoad 之前在 viewControllerB 上调用。在这个阶段我不需要这个方法在这个viewController 上运行。与此同时,viewDidLoad / viewWillApearprepareForSegueviewControllerB 调用后被调用两次

我试着做一个堆栈跟踪来看看是谁在调用它——但这就是我得到的:

* thread #1: tid = 0x5eac3, 0x0001e859 TestApp`-[viewControllerB prepareForSegue:sender:](self=0x0dad98b0, _cmd=0x0188185a, segue=0x0ce9e6f0, sender=0x0dad98b0) + 89 at viewControllerB.m:444, queue = 'com.apple.main-thread', stop reason = breakpoint 3.1   * frame #0: 0x0001e859 TestApp`-[ViewControllerB prepareForSegue:sender:](self=0x0dad98b0, _cmd=0x0188185a, segue=0x0ce9e6f0, sender=0x0dad98b0) + 89 at ViewControllerB.m:444
    frame #1: 0x015f8efa UIKit`-[UIStoryboardSegueTemplate _perform:] + 156
    frame #2: 0x015f8f87 UIKit`-[UIStoryboardSegueTemplate perform:] + 115
    frame #3: 0x011b32e2 UIKit`-[UIViewController loadViewIfRequired] + 605
    frame #4: 0x011b35d9 UIKit`-[UIViewController view] + 35
    frame #5: 0x011cd942 UIKit`-[UINavigationController _startCustomTransition:] + 778
    frame #6: 0x011da8f7 UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 688
    frame #7: 0x011db4e9 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 57
    frame #8: 0x0131c0d1 UIKit`-[UILayoutContainerView layoutSubviews] + 213
    frame #9: 0x01103964 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    frame #10: 0x023e682b libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
    frame #11: 0x0286245a QuartzCore`-[CALayer layoutSublayers] + 148
    frame #12: 0x02856244 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 380
    frame #13: 0x028560b0 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 26
    frame #14: 0x027bc7fa QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 294
    frame #15: 0x027bdb85 QuartzCore`CA::Transaction::commit() + 393
    frame #16: 0x0287b5b0 QuartzCore`+[CATransaction flush] + 52
    frame #17: 0x010929bb UIKit`_UIApplicationHandleEventQueue + 13095
    frame #18: 0x02a1e77f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
+ 15
    frame #19: 0x02a1e10b CoreFoundation`__CFRunLoopDoSources0 + 235
    frame #20: 0x02a3b1ae CoreFoundation`__CFRunLoopRun + 910
    frame #21: 0x02a3a9d3 CoreFoundation`CFRunLoopRunSpecific + 467
    frame #22: 0x02a3a7eb CoreFoundation`CFRunLoopRunInMode + 123
    frame #23: 0x04bca5ee GraphicsServices`GSEventRunModal + 192
    frame #24: 0x04bca42b GraphicsServices`GSEventRun + 104
    frame #25: 0x01094f9b UIKit`UIApplicationMain + 1225    
    frame #26: 0x0011112d TestApp`main(argc=1, argv=0xbfffedf8) + 141 at main.m:16

我不知道该怎么做。

任何人都可以了解这里发生的事情吗?

【问题讨论】:

  • 目标视图控制器的视图上有容器视图吗?容器视图有一个嵌入segue(让你的父视图控制器有机会传递子视图控制器需要的任何东西,如果有的话。
  • 实际上,是的!我需要做些什么来阻止 viewDidLoad 和 viewWillAppear 被多次调用吗?
  • 你应该看到viewDidLoad/viewDidAppear/等。在目标视图控制器(父视图控制器)上调用,然后在其子视图控制器(嵌入视图的视图控制器)上再次调用。您希望父视图控制器和子视图控制器使用不同的视图控制器,并且每个视图控制器都应该看到自己的一系列调用)。
  • 谢谢。这真的很有帮助!请将您的 cmets 标记为答案,我会接受!

标签: ios objective-c


【解决方案1】:

如果目标场景有一个您通过 Interface Builder 添加的“容器视图”,其中包括一个嵌入 segue,当您转换到父视图控制器时会自动调用它。此 segue 将触发子视图控制器及其视图的实例化,并且此过程最终在父视图控制器上调用 prepareForSegue,使其有机会传递子视图控制器可能需要的任何信息(如果有的话) .

您应该看到viewDidLoadviewDidAppear 等将在目标的父视图控制器以及子视图控制器上调用。

【讨论】:

  • 是的,但是按照什么顺序? prepareForSegue 不应该在目的地的 viewDidLoad 开始之前完成吗?还是你说反之亦然?
  • 父视图控制器中的 prepareForSegue 在子视图控制器中的 viewDidLoad 之前被调用。
  • 我不这么认为。在调用容器视图的子控制器上的 viewDidLoad 之后调用我的 prepareForSegue。
  • @MukulMore - 我刚刚确认。父级中的 prepareForSegue 在子级中的 viewDidLoad 之前调用。见gist.github.com/robertmryan/e1818a7e43c476d507408a2d6f3f5445。你能提供一个reproducible example of the behavior you describe吗?
猜你喜欢
  • 2013-02-15
  • 2016-08-19
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多