macos - 在辅助 NSWindow、Cocoa 上撤消

标签 macos cocoa

我正在尝试实现一个属性面板作为基于 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/

相关文章:

macos - 只有一个带有 FireMonkey 的应用程序实例

javascript - 使用 stringByEvaluatingJavaScriptFromString 提取 img 的 src,然后将 url 分配给 NSString 或 NSURL

cocoa ;这段代码中存在什么泄漏?

objective-c - NSCollectionView 网格只显示一行

objective-c - 简单的程序在 90 分钟左右后停止

iphone - 使用静态常量——内存停止?

python - Vim 作为 Mac OSX 上的 Python IDE

macos - 如何在 OS X Yosemite 中开发状态栏应用程序?

macos - 以管理员权限执行 shell 命令时,Applescript 应用程序在 10.9 上挂起

objective-c - 如何在基于 View 的 NSTableView 中绑定(bind) NSButton 的点击 Action