在我的主窗口中,我有一个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实例?
答案 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中工作)
var mainViewController: NSViewController?
var firstVC = firstViewController(nibName: "firstViewController", bundle: nil)
要更改视图和视图控制器,请选择以下代码:
mainViewController?.view.removeFromSuperview()
mainViewController = firstVC //or the vc you need
customView.addSubview(mainViewController?.view)
mainViewController?.view.setFrameSize(customView.bounds.size)
这就是全部。所有IBActions和IBOutlets现在都可以正常运行而不会出现任何错误。如果您需要一种方法来加载视图,请执行override func loadView() { super.loadView() ...