Swift 在没有xib文件的情况下初始化NSViewController的子类

Swift 在没有xib文件的情况下初始化NSViewController的子类,swift,macos,cocoa,Swift,Macos,Cocoa,我目前正在使用Swift 2编写一个OS X应用程序。我希望构建没有XIB或故事板的UI。我遇到的问题是初始化一个自定义ViewController,我可以将视图放入其中 这是我的AppDelegate: @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! var viewController: MyViewControl

我目前正在使用Swift 2编写一个OS X应用程序。我希望构建没有XIB或故事板的UI。我遇到的问题是初始化一个自定义ViewController,我可以将视图放入其中

这是我的AppDelegate:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

  @IBOutlet weak var window: NSWindow!
  var viewController: MyViewController?

  func applicationDidFinishLaunching(aNotification: NSNotification) {
    viewController = MyViewController()
    self.window.contentView!.addSubview(viewController!.view)
  }

  func applicationWillTerminate(aNotification: NSNotification) {
    // Insert code here to tear down your application
  }

}
和MyViewController:

class MyViewController: NSViewController {
  var textField: NSTextField?

    override func viewDidLoad() {
      super.viewDidLoad()

      textField = NSTextField(frame: NSRect(x: 10, y: 10, width: 100, height: 100))
      textField!.bezeled = false
      textField!.drawsBackground = false
      textField!.editable = false
      textField!.selectable = false
      textField!.stringValue = "TEST"
      self.view.addSubview(textField!)
    }

}
问题是,当我将
viewController
的视图添加为窗口的
contentView
的子视图时,会出现以下错误,并且视图不会加载

2015-12-06 17:34:18.204 Test[9682:1871784] -[NSNib 
_initWithNibNamed:bundle:options:] could not load the nibName: 
Test.MyViewController in bundle (null).
我不确定我做错了什么-如果有任何帮助,我们将不胜感激。

来自:

如果您为nibNameOrNil传递一个nil,那么nibName将返回nil和 loadView将引发异常;在这种情况下,您必须调用 setView:在调用视图之前,或覆盖loadView

MyViewController()
的初始值设定项使用
nil
作为名称

两种可能的修复方法:

1.在AppDelegate中设置视图 或者

2.在子类ViewController中重写loadView
您真的需要精确的
NSViewController
?您可以通过编程方式创建和添加所有
NSView
。还有,为什么不创建一个空的
NSViewController
nib.Awesome!使用第二种方法帮助我解决了抛出的异常。谢谢
func applicationDidFinishLaunching(aNotification: NSNotification) {
    viewController = MyViewController()
    viewController!.view = NSView() // added this line; edit to set any view of your choice
    self.window.contentView!.addSubview(viewController!.view)
}
import Cocoa

class MyViewController: NSViewController {
    var textField: NSTextField?

    override func loadView() {
        self.view = NSView() // any view of your choice
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        textField = NSTextField(frame: NSRect(x: 10, y: 10, width: 100, height: 100))
        textField!.bezeled = false
        textField!.drawsBackground = false
        textField!.editable = false
        textField!.selectable = false
        textField!.stringValue = "TEST"
        self.view.addSubview(textField!)
    }

}