【问题标题】:NSViewController subclass EXC_BAD_INSTRUCTION on addSubviewaddSubview 上的 NSViewController 子类 EXC_BAD_INSTRUCTION
【发布时间】: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


【解决方案1】:

您没有从 Storyboard 或 Xib 加载视图控制器。如果您正在使用,请尝试从 Storyboard/Xib 初始化您的视图控制器。那么这将不会得到。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多