【问题标题】:Objective-C iOS Development Using viewDidLoad or initWithCoder when setting Variables and Why?Objective-C iOS 开发在设置变量时使用 viewDidLoad 或 initWithCoder,为什么?
【发布时间】:2013-12-27 03:19:26
【问题描述】:

所以看起来我应该在viewDidLoad 中设置我的成员变量 - 但我很困惑为什么在initWithCoder 中设置这些变量会失败,因为这两个变量都是在程序开始时调用的。

特别是我有一行代码:

[worldView setMapType:MKMapTypeSatellite];

其中worldView 是一个IBOutlet MKMapView 对象。它适用于viewDidLoad,但不适用于initWithCoder

【问题讨论】:

    标签: ios iphone objective-c iboutlet initwithcoder


    【解决方案1】:

    调用initWithCoder 时,出口尚未连接。 来自documentation

    在实例化过程中,存档中的每个对象都是 未归档,然后使用适合其类型的方法进行初始化。 符合NSCoding 协议的对象(包括所有 UIViewUIViewController) 的子类使用它们的初始化 initWithCoder: 方法。
    ...
    毕竟对象 已经实例化和初始化,nib加载代码 为所有这些重新建立出口和操作连接 对象。然后它调用对象的awakeFromNib 方法。

    所以awakeFromNib 将是自定义设置 UI 元素的合适位置。

    【讨论】:

    • 另外,作为补充,如果您的变量正在使用视图框架,您应该在 viewWillAppear viewDidAppear 中初始化它们。
    • 我的 worldView 对象似乎也不存在于 awakeFromNib 中。这是预期的吗?
    • @user3084415:不,我希望所有网点都存在于 awakeFromNib 中。
    • @MartinR Putting NSLog(@"World View: %@", worldView);在 awakeFromNib 下显示 worldView 出于某种原因是 nil 值...我不知道为什么。
    • @user3084415:你从 nib 文件中究竟加载了什么?视图还是视图控制器?
    【解决方案2】:

    当调用initWithCoder 时,对象还不存在,而当调用viewDidLoad 时它们存在。检查您的initWithCoder 方法,通过使用以下方式注销worldView 的值:

    NSLog(@"World View: %@", worldView);
    

    它将是nil。它们将在调用viewDidLoad 之前被初始化,因此您可以在那里设置IBOutlet 的属性。

    【讨论】:

    • 当我将代码放在 initWithCoder 下时(当 worldView 尚不存在时),为什么没有错误?如果 worldView 不存在,编译器不应该抱怨,因为我正在尝试设置 nil 对象的变量吗?
    • @user3084415:在 Objective-C 中允许向 nil 发送消息(并且对于没有返回值的方法实际上会被忽略)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多