在我们的应用程序中,我们正在使用以下代码:
let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
let _ = (lInvocationTarget as! MyObjectType).myMethod(_: self.opacity, undoManager: lUndoManager)
此编译没有警告,并在Macos 10.12 Sierra下运行良好。但是,它在10.9-10.11的运行时崩溃(Mavericks直到El Capitan)。撞车报告通知:
无法将" nsundomanagerproxy"类型的价值投射为" MyObjectType"(0x108B82218)。
然后,我将代码重写为:
if let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self) as? MyObjectType {
let _ = lInvocationTarget.setOpacity(_: self.opacity, undoManager: lUndoManager)
}
那么它不会崩溃,但是撤消根本没有工作。这种最后的写作方式直接来自苹果文档,因此显然在Swift 3或10.12 SDK中改变了行为。我正在使用Xcode 8.2,带有Swift 3和SDK 10.12
registerundo(withTarget,selector:,object :)不合适,因为我还有很多其他不可扣除的方法,其中有更多的参数。真的不想将它们包裹在字典中。即使当今选择器非常安全,我仍然不喜欢它们。还有基于块的API(registerundo(withtarget:handler :)),但不幸的是仅对10.11 。
有人遇到同样的问题吗?更重要的是:有人提出出路?
我非常惊讶,以至于我在macOS 10.12上听到了您的第一个代码 Works 。方法prepare(withInvocationTarget:)
是 this-hardly-works-in-swift 的东西。返回的代理对象不仅不是原始类的实例,而且对象都不是NSObject
的后代(在某些以前的OS XS中租赁)。
无论如何,这是值得尝试的一件事:
let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
_ = (lInvocationTarget as AnyObject).myMethod(self.opacity, undoManager: lUndoManager)
我找到了 registerundowithtarget:handler:现在是更好的API。