【问题标题】:Method called in -viewWillLayoutSubviews inexplicably runs twice-viewWillLayoutSubviews 中调用的方法莫名其妙地运行了两次
【发布时间】:2013-02-18 22:39:41
【问题描述】:

我在详细视图控制器中有以下代码:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self configureView];
}

当我在-configureView 的第一行使用断点继续查看此视图​​控制器时,[self configureView] 似乎被调用了两次。然而:

  • 两次命中该方法时,堆栈如下所示:

  • 当我在上面的代码中注释[self configureView] 时,它被命中零次。
  • 显然,堆栈两次都相同,-configureView 不会递归调用自身。
  • -configureView 仅在上述代码中被调用。

【问题讨论】:

  • 所以viewWillLayoutSubviews 被调用了两次?那么问题是什么触发了视图控制器中的重新布局,对吗?
  • 是的,好点。问题是,为什么-viewWillLayoutSubviews 会被调用两次。在堆栈上以完全相同的方式。

标签: objective-c xcode cocoa-touch


【解决方案1】:

来自Apple's documentation

viewWillLayoutSubviews 方法也会在视图被其父级调整大小和定位后调用。

鉴于每当bounds 在控制器视图上发生更改时都会调用viewWillLayoutSubviews,因此不能保证它只会被调用一次。例如,每当发生旋转时都会调用它。

您的configureView 方法可能最好从其他地方调用,可能在viewWillAppearviewDidAppear 甚至BirdDetail 项目的自定义突变器中根据Hermann's suggestion

【讨论】:

    【解决方案2】:

    如果您遵循通常的模式,则在 detailItem 的设置器中调用 configureView。检查设置方法。而[detailViewController setDetailItem:something] 经常在prepareForSegue: 中调用。

    关键是:重要吗?

    【讨论】:

    • 我在-viewWillLayoutSubviews 中调用它,因为我希望在布局视图时随时从模型中更新值。在 setter 中调用它更具有结构意义,但会导致视图在 segue 之前没有更新,从而导致陈旧数据的呈现。无论如何,是的,这似乎很重要!一方面,我想了解这种行为。另外,如果我想在这种方法中进行密集操作怎么办?为什么要执行两次?
    • 我没有说你必须从二传手那里调用它。我只是想提示您实际上也可以从 setter 调用它,这可能会导致它被调用两次。就这样。但是,我不相信这是从模型中刷新数据的合适位置。 viewWillAppear 应该足以满足此目的。
    • 谢谢赫尔曼!我将在这里查看报告。我正在考虑如何引用 Knuth (c2.com/cgi/wiki?PrematureOptimization) 的名言:“程序员浪费大量时间思考或担心程序中非关键部分的速度……”。我只是想确保我了解所有这些方法如何与运行时挂钩。感谢您指出viewWillAppear
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多