2

我正在尝试将属性面板实现为基于 NSDocument 的应用程序的辅助窗口。该实现显示了一个 NSWindow(通过 NSWindowController)。

目标是,如果主(文档)或辅助(属性窗口)中的任何一个处于活动状态,则辅助窗口(“属性窗口”)中的属性修改器应该可以使用 CMD-Z 撤消。

出于某种原因,这让我望而却步。

我当前的实现/测试非常基础。为了测试这个想法,我有一个 NSSlider 绑定到一个名为“aValue”的属性,该属性暴露在“属性”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

这个想法是您单击按钮以查看属性面板,对最顶部的滑块进行更改(没有其他滑块已实现撤消),您应该能够 CMD-Z t 撤消它。

顺便说一句:如果您查看示例代码,您会看到我尝试将自定义窗口 manager.undoManager 设置为 document.undoManager。它没有任何区别。

唔。我想我要疯了。这应该很简单!一定是遗漏了一些明显的东西!

任何关于互联网人的启示?

4

1 回答 1

2

原来答案很简单。将文档设置为 NSWindow 的代表(第二个)。然后实现:

  - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window 

在 Document 上,返回 Doc 的 undoManager。

完毕。

于 2013-10-23T00:24:18.010 回答