在我们的应用中,我们使用下面的代码:NSUndoManager斯威夫特代码铸造NSUndoManagerProxy崩溃
let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
let _ = (lInvocationTarget as! MyObjectType).myMethod(_: self.opacity, undoManager: lUndoManager)
这编译没有警告和运行MacOS的10.12塞拉利昂下的罚款。然而它在运行时崩溃在10.9 - 10.11(小牛队直到El Capitan)。 崩溃报告通知:
无法投型 'NSUndoManagerProxy'(0x7fff76d6d9e8)的值设为 'MyObjectType'(0x108b82218)。
然后我重写了代码:
if let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self) as? MyObjectType {
let _ = lInvocationTarget.setOpacity(_: self.opacity, undoManager: lUndoManager)
}
那么它不会崩溃,但随后撤销是不工作的。 这最后一种写法直接来自Apples documentation,所以Swift 3或10.12 SDK中的行为显然发生了变化。我在Swift 3和SDK 10.12上使用Xcode 8.2
registerUndo(withTarget,selector:,object :)不适合,因为我有很多其他可撤销的方法和更多的参数。真的不想将这些包装在字典orso中。即使选择器现在非常安全,我仍然不喜欢它们。 还有基于块的API(registerUndo(withTarget:handler :)),但不幸的是只有10.11+。
任何人都遇到同样的问题?更重要的是:任何人想出一条出路?
我也惊讶,铸造AnyObject编译:-)。在AnyObject上调用的未知方法期望编译器警告。但我可以确认你的解决方案的作品! – Marius
我可以证实这个解决方案也适用于我(虽然我想知道为什么错误出现在第一位),但我想补充一点,我还需要声明'MyObjectType'为'NSObject'。声明只是'class MyObjectType {...}'会导致编译错误'类型'AnyObject'的值没有成员'myMethod'“。 – HuaTham