你在哪里初始化视图控制器中的属性值?
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:
就足够了。以上是关于你在哪里初始化视图控制器中的属性值?的主要内容,如果未能解决你的问题,请参考以下文章
字符串的静态 NSArray - 如何/在哪里初始化视图控制器
Storyboard 通过全局值访问 UIControl 属性