【问题标题】: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之前是否有机会在子视图控制器中初始化值?

【问题讨论】:

    标签: ios objective-c properties segue


    【解决方案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: 就足够了。
    猜你喜欢
    • 2016-08-16
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多