如何在VC中将VC设置为Liveview?

时间:2018-12-27 20:26:09

标签: swift macos cocoa swift-playground

我目前正在开发一个小型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)

3 个答案:

答案 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

运行游乐场,然后在“助手编辑器”窗格中查找。您将看到以下内容:

enter image description here


编辑我想到一种更舒适的方式编写代码(将决定从何处获取视图的决定权交给视图控制器本身)如下:

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? 让我知道是否有帮助!