我正在尝试实现一个属性面板作为基于 NSDocument 的应用程序的辅助窗口。该实现显示了一个 NSWindow(通过 NSWindowController)。
目标是,如果主窗口(文档)或辅助窗口(属性窗口)处于事件状态,则辅助窗口(“属性窗口”)中的属性修改器应该可以使用 CMD-Z 撤消。
出于某种原因,这让我无法理解。
我当前的实现/测试非常基础。 为了测试这个想法,我有一个 NSSlider 绑定(bind)到一个名为“aValue”的属性,该属性在“Properties”NWindowController 上公开。这会做这样的事情:
- (void) undoAValueUsing:(int)oldValue {
self.aValue = oldValue;
}
- (void)setAValue:(int)aValue {
if(aValue != _aValue) {
NSLog(@"Value is now: %d", aValue);
[[self.undoManager prepareWithInvocationTarget:self] undoAValueUsing:_aValue];
[self.undoManager setActionName:@"Ra"];
_aValue = aValue;
}
因此,对属性的任何更改都会记录“撤消”操作。
问题是,没有出现撤消...就好像它没有注册,或者事件菜单项正在查看其他撤消管理器。 CMD-Z 只会发出“嘟嘟”声(又名:noop)。
这个简单示例的完整代码在这里:https://dl.dropboxusercontent.com/u/421935/TestApp/Test.zip
这个想法是,您单击按钮查看属性面板,对最上面的 slider 进行更改(没有其他 slider 实现撤消),并且您应该能够使用 CMD-Z 撤消它.
顺便说一句:如果您查看示例代码,您会发现我已尝试将自定义窗口 manager.undoManager 设置为 document.undoManager。这没有什么区别。
嗯。我想我快要疯了。这应该是如此简单! 一定缺少一些明显的东西!
网络人士有什么爆料吗?
最佳答案
事实证明答案很简单。让文档将自身设置为 NSWindow(辅助窗口)的委托(delegate)。然后执行:
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
在文档上,返回文档的 undoManager。
完成。
关于macos - 在辅助 NSWindow、Cocoa 上撤消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19378935/