当前位置:  开发笔记 > IOS > 正文

initWithFrame没有被调用,但是awakeFromNib是

如何解决《initWithFrame没有被调用,但是awakeFromNib是》经验,为你挑选了2个好方法。

我试图继承NSOutlineView.这是我的代码:

OutlineViewSublcass.h:

#import 

@interface OutlineViewSubclass : NSOutlineView {

}

@end

OutlineViewSubclass.m:

#import "OutlineViewSubclass.h"

@implementation OutlineViewSubclass

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    printf("debug A\n");
    return self;
}

- (void)awakeFromNib
{
    printf("debug B\n");
}

@end

调试输出是:

debug B

为什么不(id)initWithFrame:(NSRect)frame被召唤?



1> Marc Charbon..:

Cocoa控件实现NSCoding协议以从nib中取消归档.initWithCoder:方法不是使用initWithFrame初始化对象,然后设置属性,而是负责在使用Interface Builder配置的序列化属性加载控件时设置控件.这与使用NSCoding序列化任何对象的方式非常相似.

如果你在一个没有实现NSCoding的nib中粘贴一个自定义的NSView子类,那将有点不同,在这种情况下将调用initWithFrame:在这两种情况下,都会在加载对象后调用awakeFromNib,这通常是在子类中执行其他初始化的好地方.



2> Doug Richard..:

Apple官方的答案是创建自定义视图.

在Interface Builder中创建的视图实例不会调用initWithFrame:加载它们的nib文件时,这通常会导致混淆.请记住,Interface Builder在保存nib文件时会归档对象,因此已经创建了视图实例,并且已经调用了initWithFrame:.

awakeFromNib方法提供了一个机会,可以在加载nib文件时创建视图的初始化.当加载包含视图对象的nib文件时,每个视图实例在取消归档所有对象时都会收到awakeFromNib消息.这为对象提供了初始化未使用Interface Builder中的对象存档的任何属性的机会.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有