我有一个名为NSView
的{{1}}子类,我有一个MyView
为File's Owner
的nib文件。我想在我的nib文件中创建一个视图的副本,所以我使用的是类函数,如下所示:
MyView
我已将我的nib文件视图中class MyView: NSView {
@IBOutlet var myImageView: NSImageView! // Cocoa class
@IBOutlet var myEditingField: EditingField! // Custom subclass of cocoa object
class func initWithTitle(_ title: String) -> MyView {
let myNib = NSNib(nibNamed: "MyView", bundle: nil)
var myArray = NSArray()
myNib!.instantiate(withOwner: self, topLevelObjects: &myArray) // instantiate view and put in myArray
var myViewInstance = myArray[0] as! MyView
myViewInstance.imageView.image = NSImage(named: title)
myViewInstance.myEditingField.stringValue = title // this line
return myViewInstance
}
}
的{{1}}与IBOutlet
类中的属性NSImageView
相关联,并且已连接{{} 1}}从myImageView
,我写的MyView
的自定义子类,到IBOutlet
属性。因此,要创建EditingField
的实例,我只需:
NSTextField
此方法的问题是,当myEditingField
创建视图时,它会在nib文件的视图中的MyView
上调用所需的初始值设定项let instance = MyView.initWithTitle("foo")
。最初,我将IB
的实现仅仅作为默认init(coder:)
,因为我认为EditingField
不会调用该初始化程序。我认为init(coder:)
会调用fatalError("init(coder:) is not implemented")
,但实际上它会调用IB
。所以,我尝试通过以下方式实现IB
:
init(frame:)
不幸的是,这也不起作用。当我使用init(coder:)
中的上述初始化程序运行项目时,init(coder:)
中的行class EditingField: NSTextField {
var id: String
// ... other properties
required init?(coder: NSCoder) {
print("init coder")
self.id = "default"
// ... other properties get default values, just like id
super.init(coder: coder)
}
}
会引发错误。发生这种情况时,调试器控制台会显示属性EditingField
为零,并且与myViewInstance.myEditingField.stringValue = title
不同,根本没有初始化(尽管MyView
中的打印消息仍然存在打印!)
所以,我的问题是(1)如何从包含自定义对象的nib文件初始化/创建myEditingField
? (2)为什么myImageView
在init(coder:)
上调用NSView
? (3)尽管打印消息表明初始化程序已经运行,为什么IB
为零?