无论对象是从 nib 加载还是以编程方式创建,执行初始化代码的正确方法是啥?

Posted

技术标签:

【中文标题】无论对象是从 nib 加载还是以编程方式创建,执行初始化代码的正确方法是啥?【英文标题】:What's the correct way to perform initialization code whether an object is loaded from a nib or created programmatically?无论对象是从 nib 加载还是以编程方式创建,执行初始化代码的正确方法是什么? 【发布时间】:2010-01-24 21:09:14 【问题描述】:

我注意到,如果你从一个 nib 加载连接的视图,如果你想添加初始化代码,你必须重写 initWithCoder,因为指定的初始化程序不会被调用(这确实有意义),如果你不从 nib 加载视图,然后需要在指定的初始化程序中执行相同的代码。

因此,为了处理这两种情况,您需要在两种方法中使用相同的初始化代码。

这是迄今为止我想出的最佳解决方案,但我想知道是否有一些更传统的方法可以做到这一点。此代码位于 UITableViewCell 子类中,但实际上可以是任何 UIView:

/*
 * Seems like there should be a standard method for this already.
 */
- (void)didFinishInitializingOrUnacrhiving 
    /*** Do stuff that makes the most sense to do in an initializer. ***/


- (id)initWithCoder:(NSCoder *)aDecoder 
    if (self = [super initWithCoder:aDecoder]) 
        [self didFinishInitializingOrUnacrhiving];
    
    return self;


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) 
        [self didFinishInitializingOrUnacrhiving];
    
    return self;

那么对此有什么想法吗?这是做事的“正确方式”吗,这里有潜在的陷阱,还是我完全错过了什么?

【问题讨论】:

请注意,在使用 -initWithCoder 时:您的接收器需要向其发送消息的其他对象可能尚未启动。 -awakeFromNib 可能是更好更安全的选择。请参阅 -awakeFromNib 的文档。 Giao,如果您给出了答案而不仅仅是评论,我会将其标记为已接受的答案 :) 我认为使用 awakeFromNib 确实可以解决一些问题。 它并没有真正解决您的问题。它只是揭示了很多光。 【参考方案1】:

我在另一个答案中对此进行了解释,请参阅Does interface builder use the init method to initialize view controllers?

【讨论】:

谢谢。我希望有人可能会更多地了解每项操作时可能出现的问题。您是否知道是否有任何好的文档或讨论可以解释有关初始化与取消归档的问题?我的意思是基本问题是归档对象已经初始化,因此不应该从头开始重新初始化,因为这通常会破坏归档的整个目的。非 nib 文件呢?有没有更通用的 awakeFromDecoding 之类的?还是重写 initWithCoder 本质上就是这样? Apple 文档是一个很好的起点,尽管有时有点简洁。有时不知道自己在寻找什么可能是个问题。 bit.ly/9iPNgb initWithCoder 用于解码期间的初始化。请注意,在此覆盖中,不能保证连接出口和操作,但使用 awakeFromNib 时它们是连接的。 Aaron Hillegass 的“Cocoa Programming for Mac OS X”是 Cocoa 编程的一个很好的起点。他涵盖了这个主题和许多其他主题。他也是一个好人。如果你负担得起,或者说服你的雇主,他在 Big Nerd Ranch 的课程非常棒。【参考方案2】:

我做的完全一样,只是我很懒,我的方法通常称为-didInit

【讨论】:

以上是关于无论对象是从 nib 加载还是以编程方式创建,执行初始化代码的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 以编程方式从 NSView 的子类加载对象

以编程方式加载 nib2 时,来自 nib1 的 awakeFromNib 被调用

以编程方式创建视图 VS。笔尖

如何在 SWIFT 中以编程方式将我的自定义控制器变成根控制器? (无法加载 NIB)

以编程方式更新 nib 的框架和内容

当视图控制器从 nib 文件加载时,以模态方式在当前上下文中呈现视图控制器