我目前正在开发一个小型Playgrounds项目(适用于macOS),并且正在尝试将自己的View Controller设置为实时视图。以下行不起作用。
PlaygroundPage.current.liveView = ViewController()
运行此程序时,出现以下错误。
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
使用此命令时出现相同的错误:
PlaygroundPage.current.liveView = ViewController(nibName: NSNib.Name("MyView"), bundle: Bundle.main)
答案 0 :(得分:2)
选择“文件”>“新建”>“操场”,然后从名为“单一视图”的MacOS操场模板开始。这将为您提供一个笔尖的视图。
现在如下修改操场上的代码:
import AppKit
import PlaygroundSupport
class ViewController : NSViewController {}
let nibFile = NSNib.Name("MyView")
var topLevelObjects : NSArray?
Bundle.main.loadNibNamed(nibFile, owner:nil, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as! Array<Any>).filter { $0 is NSView }
let vc = ViewController()
vc.view = views[0] as! NSView
PlaygroundPage.current.liveView = vc
运行游乐场,然后在“助手编辑器”窗格中查找。您将看到以下内容:
编辑我想到一种更舒适的方式编写代码(将决定从何处获取视图的决定权交给视图控制器本身)如下:>
class ViewController : NSViewController {
override func loadView() {
let nibFile = NSNib.Name("MyView")
var topLevelObjects : NSArray?
Bundle.main.loadNibNamed(
nibFile, owner:nil, topLevelObjects: &topLevelObjects)
let views = (topLevelObjects as! Array<Any>).filter { $0 is NSView }
self.view = views[0] as! NSView
}
}
PlaygroundPage.current.liveView = ViewController()
答案 1 :(得分:1)
您的错误来自于您的ViewController()
没有任何视图。这里是documentation的链接。
如果为nbNameOrNil输入nil,那么nibName将返回nil,并且 loadView将抛出异常;在这种情况下,您必须调用 setView:在调用视图之前,或重写loadView。
一个可能的解决方法:
let myVC = NSViewController()
myVC.view = NSView()
PlaygroundPage.current.liveView = myVC
在第二种情况下,您是否按照documentation所述将文件的NIB所有者设置为当前的视图控制器?
指定的nib文件通常应具有该文件的类 使用视图将所有者设置为NSViewController或自定义子类 连接到视图的插座。
答案 2 :(得分:-1)
您可能要包括以下内容:
PlaygroundPage.current.liveView = ViewController()
PlaygroundPage.current.needsIndefiniteExecution = true
我将链接附加到类似的问题:How to setup ViewController in Playgrounds? 让我知道是否有帮助!