使用NSNib在其中使用自定义对象实例化NSView

时间:2016-12-24 11:45:02

标签: swift cocoa instantiation nsview

我有一个名为NSView的{​​{1}}子类,我有一个MyViewFile'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)为什么myImageViewinit(coder:)上调用NSView? (3)尽管打印消息表明初始化程序已经运行,为什么IB为零?

0 个答案:

没有答案