NSView初始化:-init:vs. -awakeFromNib:

Gun*_*gel 7 user-interface cocoa objective-c nsview

我有一个MyView继承自它的简单类NSView和实例变量NSImage * image;.类功能是在视图上绘制图像.

但是,在-drawRect:图像实例中总是相等nil,如果它在-init:函数中初始化而不是nil在初始化中-awakeFromNib:.日志显示两者-init:,-awakeFromNib:函数只调用一次.

是否-awakeFromNib:默认重新初始化GUI组件?

Jos*_*ell 9

没有awakeFromNib.没有默认实现.

您的问题是您正在覆盖错误的初始化方法.一个NSView指定初始化initWithFrame:.你的子类的普通init永远不会被调用,这就是你的imageivar没有指向任何东西的原因.

您可以在awakeFromNib或中初始化该ivar initWithFrame:.没什么区别.前者在后者之后调用,它作为一个点提供,您可以插入需要与笔尖中的其他对象交互的初始化代码(通过您的IBOutlets).

  • 你的自定义子类的`initWithFrame:`根本不会被调用只有_one_ case:当它继承自IB调色板中存在的另一个`NSView`子类(例如,`NSImageView`)时,你创建了你的实例通过更改Identity检查器中的类来自定义子类.在这种情况下,将调用AppKit子类的`initWithFrame:`_will_,并且您的自定义子类将在`awakeFromNib`之前获得`initWithCoder:`.如果使用IB中的"自定义视图"对象创建视图实例,则视图的"initWithFrame:"确实会被调用. (7认同)
  • 尽管在某些情况下`-initWithFrame` [根本没有被调用](http://stackoverflow.com/questions/433539/initwithframe-not-called-but-awakefromnib-is)。 (2认同)