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

Posted

技术标签:

【中文标题】如何在 Playgrounds 中将 VC 设置为 Liveview?【英文标题】:How can I set a VC as Liveview in Playgrounds? 【发布时间】:2018-12-27 20:26:08 【问题描述】:

我目前正在开发一个小型 Playgrounds 项目(适用于 macOS),我正在尝试将自己的视图控制器设置为实时视图。以下行不起作用。

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)

【问题讨论】:

【参考方案1】:

选择 File > New > Playground 并从名为 Single View 的 MacOS Playground 模板开始。这将为您提供一个笔尖的视图。

现在修改playground中的代码如下:

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

运行 Playground 并查看 Assistant Editor 窗格。你会看到这个:


编辑在我看来,一种更愉快的编写方式(将决定从何处获取视图的决定交由视图控制器本身决定)如下:

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()

【讨论】:

谢谢您,先生。像魅力一样工作。 编辑了我的答案,使其更适合面向对象。 这样更好。非常感谢!【参考方案2】:

您的错误来自因为您的ViewController() 没有任何视图。这里是documentation的链接。

如果你为 nibNameOrNil 传入一个 nil,那么 nibName 将返回 nil 并且 loadView 会抛出异常;在这种情况下,您必须调用 setView:在视图被调用之前,或者覆盖 loadView。

一种可能的解决方法:

let myVC = NSViewController()
myVC.view = NSView()

PlaygroundPage.current.liveView = myVC

在第二种情况下,您是否按照documentation 所说的那样将 NIB 的文件所有者设置为当前视图控制器?

指定的 nib 文件通常应该具有文件的类 owner 设置为 NSViewController 或自定义子类,与视图 连接到视图的插座。

【讨论】:

【参考方案3】:

您可能希望包括以下内容:

PlaygroundPage.current.liveView = ViewController()
PlaygroundPage.current.needsIndefiniteExecution = true

我附上类似问题的链接:How to setup ViewController in Playgrounds? 如果有帮助,请告诉我!

【讨论】:

感谢您的回答。不幸的是,我仍然遇到同样的错误。 ://

以上是关于如何在 Playgrounds 中将 VC 设置为 Liveview?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vc++ 中将 char* 转换为 LPWSTR..........................? [复制]

如何在 VC++ 中将 char* 转换为 LPWSTR?

如何在 vc 6.0 中将对象转换或分配为 Variant 类型

如何在 mFC VC++ 中将编辑控件的背景转换为透明?

在 VC++ 中将 TCHAR 转换为 LPWSTR?

如何在 Swift Playgrounds 中使用带有纹理的 SKNode 设置 SKScene?