【发布时间】:2018-03-24 08:36:10
【问题描述】:
我正在尝试编写一些跨平台的 macOS 和 iOS 代码。我知道这不是这样做的方法,但是我不得不奇怪地开发一些东西,因为我正在做一本 Playground 书,而 Metal 在模拟器上不起作用。
所以我有以下类型定义。有两组,一组用于我希望在 MacOS 中编译,另一组用于 iOS
//iOS
public typealias View = UIView
public typealias ViewController = UIViewController
//macOS
public typealias View = NSView
public typealias ViewController = NSViewController
我一次只保留一组未注释。
以下代码在 iOS 上完美运行
public class PVC: NSViewController{
public override func viewDidLoad() {
super.viewDidLoad()
}
public required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public init() {
super.init(nibName: nil, bundle: nil)
}
public func addView(viewer: NSView) {
view.addSubview(viewer)
}
}
let pvc = PVC()
let grid = //UIView initializer
pvc.addView(viewer: grid)
但在 MacOS 上,pvc.addView 行编译但在运行时会导致消息 error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.。
我已经检查并且网格视图正确形成,并且可以在必要时例如添加到默认 IOS 项目的视图控制器中。导致此问题的只是 NSViewControllers 的某些问题。
【问题讨论】:
-
是否定义了
view?默认情况下,视图控制器会从其 nib/storyboard 延迟加载其视图对象。所以第一次使用view将尝试从应用程序包中加载它。我首先测试看看self.view是否返回一个有效的NSView对象。 -
@JamesBucanek 如果你在里面打印视图,你会得到一个错误的指令,但它是非可选类型的,这是非常奇怪的。我该怎么办?
-
一个视图控制器需要一个有效的 nib 文档来加载它的视图(如果你不给它一个名字,它会期望一个带有类名的 nib,即
PVC.nib)或者你可以在使用之前设置view属性。 view 属性是非可选的,因为它应该始终有效;不提供视图或笔尖是编程错误。 -
我应该将视图初始化为什么?只是一个通用的 NSView?
-
听起来不错!
标签: swift cocoa nsviewcontroller