【问题标题】:Order of Calls on performSegueWithIdentifierperformSegueWithIdentifier 的调用顺序
【发布时间】:2012-06-15 22:56:05
【问题描述】:

当我调用performSegueWithIdentifier: 时,我随后会覆盖prepareForSegue:,以便在我的目标视图控制器上设置一些属性。但是,我正在尝试了解此处的操作顺序以确保其安全。

我实例化目标视图控制器:

MyViewController *myVC = (MyViewController*)segue.destinationViewController;

之后我在其上设置了一些属性 - 即,我初始化创建另一个处理加载不同 Web 视图的对象,然后在该对象上设置属性:

[myVC setFormHandler:
    [[WebFormHandler alloc] initWithSelectedFormName:[self theFormName]]];

在我的目标控制器的viewDidLoad: 中,然后我查询此对象的属性,并使用它来加载正确的 Web 视图。现在,我对首先发生的事情感到有些困惑——属性的设置,或者目标控制器上的viewDidLoad:。是否可以肯定地说,视图控制器的属性总是在调用viewDidLoad: 之前从prepareForSegue: 设置?

【问题讨论】:

  • 我认为这篇 SO 帖子回答了您的问题 stackoverflow.com/a/8854475/1452351
  • 有趣。所以似乎总是先调用 prepareForSegue,然后调用 viewDidLoad。考虑到视图控制器是在 prepare 方法中实例化的,这对我来说似乎很奇怪。
  • viewDidLoad 与实例无关,而是与屏幕上显示的视图相关联。此外,您没有实例化视图控制器,您只是获得了对由框架或父控制器创建的现有对象的引用

标签: objective-c ios uiviewcontroller


【解决方案1】:

看起来您可能已经从其他帖子中找到了答案,但我只是想澄清一点。

标准流程是

performSegue -> 准备 -> loadView(在目标控制器中)

但是,在 popover segues 中,目标视图是在调用 prepareForSegue 之前加载的。

注意:在 iOS 8 中不再是这种情况。在 iOS 8 中,popover segue 的视图在调用 prepareForSegue 时不会加载。

【讨论】:

  • 对popover segues很感兴趣。那么我假设的正确方法是在prepareForSegue中设置属性时覆盖setter来更新目标视图控制器..似乎很麻烦!
  • 通常你不希望在准备 segue 中更新视图片段,但你可以设置属性,然后在实际加载视图时在目标 vc 中使用这些属性。或者,您可以将源 vc 设置为目标的委托,然后在目标的加载视图中,它可以向委托请求数据。
  • @bgoers 提出的观点是,popover segue 中的目标视图控制器在调用源的prepareForSegue:sender: 之前完成所有设置。我现在正在处理这个问题,这是一个巨大的麻烦,并且与其他 segues 不必要地不同。
  • @SteveMadsen 所说的正是我正在努力解决的问题。我最终得到了一个不同的实现,但我相信在相关属性上覆盖设置器,然后从设置器更新视图,将是一个可行的解决方案。虽然未经测试.. 只是奇怪的是它会在调用 prepareForSegue 之前通过视图加载
  • 嘿伙计们,只是想更新你,因为这在 iOS 8 中发生了变化。从这个版本开始,popover segue 似乎不再在 prepareForSegue 之前加载。
猜你喜欢
  • 2015-01-12
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2022-01-12
相关资源
最近更新 更多