如何在 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..........................? [复制]