我继承了一个代码库,发现编译器抱怨这段代码:
- (id)initWithFrame:(CGRect)frame {
// is this really missing??
// self = [super initWithFrame:frame];
self = [[[NSBundle mainBundle] loadNibNamed:@"DigitsKeyboardView" owner:self options:nil] firstObject];
return self;
}
XCode 抱怨超类中指定的初始值设定项未被调用。如果我取消注释对超级的调用,错误显然会消失。但是由于该应用程序并没有打扰相当多的iOS版本缺少该行,因此我不确定这是否是学术要求,或者在这种情况下甚至可能是错误的。
使用 self
调用 loadNibNamed
方法,然后覆盖该self
。这会导致无法立即看到的麻烦吗?
,正确的实现是什么?
initWithFrame - 初始化并返回具有指定框架矩形的新分配视图对象。 视图的框架矩形,以磅为单位。框架的原点相对于您计划在其中添加它的超级视图。此方法使用框架矩形相应地设置中心和边界属性。
参数为帧 - 视图的框架矩形,以磅为单位。框架的原点相对于您计划在其中添加它的超级视图。此方法使用框架矩形相应地设置中心和边界属性。
所以你应该像这样在下面打电话
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code
NSArray *arrNibView = [[NSBundle mainBundle] loadNibNamed:@"DigitsKeyboardView" owner:self options:nil];
UIView *nibView = (UIView*)[arrNibView objectAtIndex:0]; //Give here your first object
[self addSubview:nibView];
}
return self;
}
如果您有多个自定义视图,并且如果要将自定义视图用于单独的控制器,则可以使用上述方法。
但是如果您有自定义视图和如果您想使用(重用)多个 在多个视图控制器中,您需要实现机器人 initWithFrame 和 awakeFromNib 方法
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code
[[NSBundle mainBundle] loadNibNamed:@"DigitsKeyboardView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
- (void) awakeFromNib
{
[super awakeFromNib];
[self addSubview:self.view];
}
initWithFrame - 建议您实现此方法。你 除了 或 而不是这种方法。
awakeFromNib - awakeFromNib 在视图及其之后被调用 子视图已分配并初始化。可以保证 视图将设置其所有插座实例变量。
从笔尖清醒的详细说明
在实例化过程中,存档中的每个对象都是 未存档,然后使用适合其类型的方法进行初始化。 Cocoa 视图(以及可以使用 关联的界面生成器选项板)使用其初始化 initWithCoder: 方法。自定义视图使用其初始化 initWithFrame: 方法。已在 中实例化的自定义类 笔尖使用其 init 方法初始化。
从存档中实例化并初始化所有对象后,nib 加载代码会尝试重新建立连接 在每个对象的出口和相应的目标对象之间。如果 您的自定义对象有出口,NSNib 对象尝试 重新建立您在界面生成器中创建的任何连接。它 首先尝试使用对象自己的建立连接 方法第一。对于每个需要连接的插座,NSNib object 在对象中查找表单为 setOutletName: 的方法。 如果该方法存在,NSNib 对象将调用它,并传递目标 对象作为参数。如果您没有使用它定义 setter 方法 确切名称,NSNib 对象在对象中搜索实例 变量(类型为IBOutlet id)具有相应的出口名称,以及 尝试直接设置其值。如果实例变量具有 找不到正确的名称,该连接的初始化确实如此 不会发生。最后,在所有对象完全初始化后,每个 收到一条 awakeFromNib 消息。
苹果文档
UIView
initWithFrame
清醒从笔尖
其他来源
加载笔尖文件
使用 xib 初始化视图
从笔尖呼叫中醒来
viewDidLoad 和 awakeFromNib 定时