Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 什么';无论对象是从nib加载还是以编程方式创建,执行初始化代码的正确方法是什么?_Iphone_Objective C_Interface Builder_Nib - Fatal编程技术网

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

Iphone 什么';无论对象是从nib加载还是以编程方式创建,执行初始化代码的正确方法是什么?,iphone,objective-c,interface-builder,nib,Iphone,Objective C,Interface Builder,Nib,我注意到,如果您从nib加载连接视图,如果您想添加初始化代码,则必须重写initWithCoder,因为指定的初始值设定项没有被调用(这是有意义的),如果您没有从nib加载视图,则需要在指定的初始值设定项中执行相同的代码 因此,为了处理这两种情况,两种方法都需要相同的初始化代码 这是迄今为止我提出的最好的解决方案,但我想知道是否有更传统的方法来实现这一点。此代码位于UITableViewCell子类中,但它可以是任何UIView: /* * Seems like there should be

我注意到,如果您从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;
}

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

我做的事情完全一样,除了我很懒,我的方法通常被称为
-didInit

之外,我在另一个答案中解释了这一点。请注意,当使用-initWithCoder时:接收者需要发送消息的其他对象可能尚未启动-从NIB醒来可能是更好更安全的选择。请参阅-awakeFromNib.Giao的文档,如果您做出了回答,而不仅仅是评论,我会将其标记为已接受的答案:)我认为使用awakeFromNib确实解决了一个案例中的一些问题。但它并没有真正解决您的问题。它只是散发出很多光芒。谢谢。我希望有人在做每一件事时能更多地了解问题所在。你知道有没有什么好的文件或讨论可以解释初始化与去Chiving之间的问题?我的意思是,基本问题是归档对象已经初始化,因此不应该从头开始重新初始化,因为这通常会破坏归档的整个目的。非nib文件呢?是不是有一种更普遍的解码意识?或者用编码器重写initWithCoder本质上就是这样吗?苹果的文档是一个很好的开始,尽管有时有点简洁。有时不知道你在找什么可能是个问题。initWithCoder用于解码期间的初始化。请注意,在此覆盖中,插座和动作不保证连接,但通过awakeFromNib,它们可以连接。Cocoa编程的一个很好的起点是Aaron Hillegass的“MacOS X的Cocoa编程”。他涵盖了这个话题和其他许多话题。他也是个好人。如果你能负担得起,或者说服你的雇主,他在Big Nerd Ranch的课程非常好。