【发布时间】:2016-12-19 10:41:53
【问题描述】:
在我们的应用程序中,我们使用以下代码:
let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
let _ = (lInvocationTarget as! MyObjectType).myMethod(_: self.opacity, undoManager: lUndoManager)
编译时没有警告,并且在 macOS 10.12 Sierra 下运行良好。然而,它在 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 中行为显然发生了变化。我将 Xcode 8.2 与 Swift 3 和 SDK 10.12 一起使用
registerUndo(withTarget, selector:, object:) 不合适,因为我有很多其他带有更多参数的可撤消方法。真的不想把它们包装在字典里。即使现在选择器是相当安全的类型,我仍然不喜欢它们。 还有基于块的 API (registerUndo(withTarget: handler:) ),但不幸的是,这仅适用于 10.11+。
有人遇到过同样的问题吗?更重要的是:有人想出出路吗?
【问题讨论】:
标签: swift macos nsundomanager