OS X在swift中添加来自xib的子视图

时间:2014-12-01 12:24:33

标签: xcode macos cocoa swift nsviewcontroller

我尝试使用swift为OS X添加一个新的子视图形式的笔尖。

到目前为止我已经:

  • 创建了一个新的" Cocoa Application"
  • 添加了一个新的" Cocoa Class"叫" TestSubView"作为带有XIB文件的NSViewController的子类

我想在加载应用程序时将此子视图添加到我的主视图中。

在我的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).

我意识到我需要确定这个子视图的大小和位置,但我似乎无法达到这一点。

我花了一天的大部分时间试图弄清楚这一点,所以任何帮助都会非常感激。

2 个答案:

答案 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确实被称为您正在使用的名称,并且至少包含一个视图(否则上面的两个展开!会使您的应用崩溃。)