Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSNDOManager在Swift代码中引发NSNDOManagerProxy崩溃_Swift_Macos_Nsundomanager - Fatal编程技术网

NSNDOManager在Swift代码中引发NSNDOManagerProxy崩溃

NSNDOManager在Swift代码中引发NSNDOManagerProxy崩溃,swift,macos,nsundomanager,Swift,Macos,Nsundomanager,在我们的应用程序中,我们使用以下代码: let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self) let _ = (lInvocationTarget as! MyObjectType).myMethod(_: self.opacity, undoManager: lUndoManager) 这在macOS 10.12下编译时没有警告,运行良好。然而,它在10.9-10.11的运行时崩溃(直到ElCapit

在我们的应用程序中,我们使用以下代码:

let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
let _ = (lInvocationTarget as! MyObjectType).myMethod(_: self.opacity, undoManager: lUndoManager)
这在macOS 10.12下编译时没有警告,运行良好。然而,它在10.9-10.11的运行时崩溃(直到ElCapitan的小牛)。 事故报告指出:

无法将类型为“NSUndoManagerProxy”(0x7fff76d6d9e8)的值强制转换为“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一起使用

RegisterEndo(withTarget,selector:,object:)不合适,因为我有很多其他具有更多参数的可撤消方法。我真的不想把它们放在字典里。即使现在选择器非常安全,我还是不喜欢它们。 还有基于块的API(registerUndo(withTarget:handler:)),但不幸的是,这仅适用于10.11+


有人遇到过同样的问题吗?更重要的是:有人想出了解决办法吗?

我非常惊讶地听到您的第一个代码在macOS 10.12上运行。方法
prepare(withInvocationTarget:)
一直是一个很难在Swift中使用的方法。不仅返回的代理对象不是原始类的实例,而且该对象也不是
NSObject
(至少在某些以前的OS X中)的后代

无论如何,这是一件值得尝试的事情:

let lInvocationTarget = lUndoManager.prepare(withInvocationTarget: self)
_ = (lInvocationTarget as AnyObject).myMethod(self.opacity, undoManager: lUndoManager)

我发现RegisterEndowithTarget:handler:现在是一个更好的API

我还感到惊讶的是,对任何对象的转换编译:-)。对AnyObject调用的未知方法预期会出现编译器警告。但我可以确认你的解决方案有效!我可以确认此解决方案也适用于我(尽管我想知道为什么会出现错误),但我想补充一点,我还需要将
MyObjectType
声明为
NSObject
。仅声明
类MyObjectType{…}
将导致编译错误“类型'AnyObject'的值没有成员'myMethod'。