你在哪里初始化视图控制器中的属性值?

Posted

技术标签:

【中文标题】你在哪里初始化视图控制器中的属性值?【英文标题】:Where do you initialize property values in a View Controller? 【发布时间】:2013-10-31 02:27:36 【问题描述】:

我有一个视图控制器,它的属性决定了它的行为。这些是由其父级在prepareForSegue 中设置的。

这在我的程序中引起的潜在错误是不能保证有问题的父级设置属性,所以我希望有一个默认值。在研究中,我现在了解到 Objective C 中的属性没有默认值。这给我留下了以下选择:

在子视图的viewDidLoad 方法中设置属性的默认值。然而,在调查中,viewDidLoad 在父级中被称为 after prepareForSegue - 所以当父级实际设置属性时,我会覆盖父级的值。 然后我想我可以使用(id) init 来初始化这些值,但是,至少在使用情节提要时,根本不会调用此方法!

我可能有一个解决方法,即对象将初始化为默认值,但在这种情况下,我只想传入一个 BOOL。而且由于布尔值即使没有正确初始化也会有一些值,所以我无法测试它是否为非零。

在父视图控制器prepareForSegue之前是否有机会在子视图控制器中初始化值?

【问题讨论】:

【参考方案1】:

覆盖init 将无济于事,因为它不是UIViewController 对象的指定初始化程序。当手动实例化视图控制器 - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 被调用时,从情节提要加载时 - (id)initWithCoder:(NSCoder *)decoder 将被调用。如果你想在视图控制器初始化时设置属性,你必须重写这两个初始化器。

经过研究,我现在了解到 Objective C 中的属性没有默认值。

确实如此。 nil 用于对象,0 用于整数值,0.0 用于浮点等。如果您需要其他默认值,则应在适当的 init 方法中设置它们。

【讨论】:

你必须覆盖both?到目前为止,这可能是我在 Objective C 中看到的最笨拙的东西。遗憾的是,没有像 viewDidLoad 这样的钩子可以在外部参与者向您的视图控制器发送消息之前执行。 必须同时覆盖两者是非常不寻常的。大多数对象要么来自故事板,要么不来自故事板。如果它们来自故事板,那么覆盖 initWithCoder:(或 awakeFromNib)就足够了。如果您正在编写一段极其可重用的代码,那么创建一个可以从两个初始化路径调用的-setup 方法并不少见。但在许多情况下,仔细选择属性含义可以使默认值起作用(0、NO、nil 等),因此您无论如何都不需要初始化它们。在实践中,我发现它并不经常出现。 所以也许我不明白 - 我是否必须只覆盖一个或两个来实现我正在寻找的初始化器? @Rob - 对以前现在已删除的答案的评论也很有帮助。我没有意识到 BOOL 保证被初始化为 0,是的,我可以使用该信息制作我想要的东西。我对仅初始化一个或两个都进行了更多的后续操作,因此我了解 ios 的这一部分是如何工作的。 如果您希望能够同时使用情节提要和手动分配的视图控制器,那么您必须同时覆盖两者。如果您只使用故事板,覆盖 initWithCoder: 就足够了。

以上是关于你在哪里初始化视图控制器中的属性值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 nib 中的视图重新加载 UIView 属性

字符串的静态 NSArray - 如何/在哪里初始化视图控制器

Storyboard 通过全局值访问 UIControl 属性

你在哪里设置子视图的图层属性?为啥不在 initWithCoder 中

这个标签栏控制器应该嵌入在哪里?

iOS - 在哪里初始化视图