Swift中的NSViewController - 无法解包Optional.None

时间:2014-07-06 21:24:55

标签: cocoa swift

在我的主窗口中,我有一个CustomView。根据用户选择的内容,将更改此视图。为了获得清晰的源代码,我为每个新视图创建了一个带有新xib文件的NSViewController。然后我将我的IBOutlets连接到新的ViewControllers。这很完美。但是,如果我添加一个IBAction,Xcode说,它无法连接到该动作。所以我用Google搜索,我发现,我不应该将所有IBOutlets和IBActions连接到ViewController的文件所有者。相反,我向新的xib文件添加了一个新的NSObject,并将Class设置为我的ViewController类。如果我现在想要访问IBOutlets,我收到错误fatal error: Can't unwrap Optional.None,我想要访问IBOutlet。

有什么想法吗?使用NSViewControllers的正确方法是什么。我必须添加一个NSObject吗?然后创建了多少个ViewController实例?

2 个答案:

答案 0 :(得分:1)

"无法打开Optional.None"当你有一个隐式解包的可选项(一个用!定义的)nil但你仍试图使用它时会发生什么。例如:

var aNumber : Int! = nil
aNumber + 5 //fatal error: Can't unwrap Optional.None

我相信在Swift默认情况下会声明存储被隐式展开,因此您可能会尝试使用未在界面构建器(或您的故事板或其他任何内容)中连接的插座执行某些操作)。


至于其他方面,很难理解你在应用中做了什么。我知道你对每个视图都有一个NSViewController,但是你连接到哪些出口?你在哪里添加IBAction?你的意思是哪个文件的所有者,窗口的笔尖的拥有者?您NSViewController的所有者?

听起来像你这样做太复杂了,添加更多NSObject的混音几乎肯定是错误的方法。看看你是否可以简化或在某个地方上传你的项目,这样我们就可以看一看并更好地诊断你的问题。

答案 1 :(得分:0)

我现在有了解决方案。以下是使用NSViewController的方法:(在Beta 3中工作)

  1. 创建一个新应用并将CustomView添加到主窗口。将此自定义视图连接到AppDelegate。
  2. 将此var添加到您的AppDelegate:var mainViewController: NSViewController?
  3. 创建一些新的Swift Cocoa类作为NSViewController的子类并检查"还为用户界面创建XIB文件"尽可能多的。
  4. 对于每个ViewController,向AppDelegate添加一个新变量,如下所示:var firstVC = firstViewController(nibName: "firstViewController", bundle: nil)
  5. 现在编辑新的xib文件并将所有内容连接到对应的swift文件。
  6. 要更改视图和视图控制器,请选择以下代码:

    mainViewController?.view.removeFromSuperview()
    mainViewController = firstVC //or the vc you need
    customView.addSubview(mainViewController?.view)
    mainViewController?.view.setFrameSize(customView.bounds.size)
    
  7. 这就是全部。所有IBActions和IBOutlets现在都可以正常运行而不会出现任何错误。如果您需要一种方法来加载视图,请执行override func loadView() { super.loadView() ...