我尝试使用swift为OS X添加一个新的子视图形式的笔尖。
到目前为止我已经:
我想在加载应用程序时将此子视图添加到我的主视图中。
在我的ViewController(主窗口的ViewController)中。
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let newSubView = TestSubView();
self.view.addSubview(newSubView.view);
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
但我收到以下错误
Failed to set (contentViewController) user defined inspected property on (NSWindow):
-[NSNib initWithNibNamed:bundle:] could not load the nibName: temp.TestSubView in bundle (null).
我意识到我需要确定这个子视图的大小和位置,但我似乎无法达到这一点。
我花了一天的大部分时间试图弄清楚这一点,所以任何帮助都会非常感激。
答案 0 :(得分:3)
我终于把这件事搞定了。我的新代码看起来像
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let subview = TestSubView(nibName: "TestSubView", bundle: nil)!
self.view.addSubview(subview.view)
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
在the docs&帮助下找到this answer
有人建议,如果笔尖名称和类名相同,则不需要声明nibname:
(正如我原本试图做的那样),但文档没有提到这一点 - 解释为什么它不起作用!
为了繁荣,我在OS X Yosemite(10.10.1)上使用Xcode 6.1.1为我工作
答案 1 :(得分:1)
nib实际上只是一个包含视图信息的XML文件。您必须从应用程序包中获取它并明确地获取其中包含的一个视图。您可能会混淆视图和视图控制器(您尝试从view
中提取newSubView
表明这一点。
试试这个:
let subview = NSBundle.mainBundle().loadNibNamed("TestSubView",
owner:self, options:nil)![0]! // maybe no final unwrapping "!" in Swift 3
self.view.addSubview(subview)
确保xib确实被称为您正在使用的名称,并且至少包含一个视图(否则上面的两个展开!
会使您的应用崩溃。)