NSUndoManager 和“撤消/重做”菜单项彼此“断开连接”

NSUndoManager and Undo/Redo Menu Items "disconnected" from each other

提问人:silverdr 提问时间:10/31/2023 最后编辑:silverdr 更新时间:11/6/2023 访问量:37

问:

在 Cocoa 应用程序中,我实现了撤消/重做,并且功能按预期工作。问题在于,这两个(“撤消”和“重做”)菜单项似乎都与正在使用的 NSUndoManager “断开连接”,从某种意义上说,它们没有根据撤消/重做堆栈大小禁用/启用。它们始终保持启用状态,并且也不会更新其“操作名称”

[undoManager setActionName:@"Move To Trash"];

似乎无效。菜单项始终显示“撤消”和“重做”。这两个项目都发送了它们的操作,并且操作有效。First Responder

由于应用程序不是基于的,我也尝试实现NSDocument

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)sender;

正如我在几个地方读到的那样,在窗口的委托中可能会有所帮助。该方法在操作和撤消时都会被调用,但这不会改变任何内容。一切行为都与没有此委托方法一样。

我还可能做错了什么或遗漏了什么?

macOS Cocoa nsundomanager

评论

0赞 Willeke 10/31/2023
第一响应者是否返回正确的撤消管理器?
0赞 silverdr 10/31/2023
由于这些操作有效,我假设“是”。我还能检查什么/如何检查?
0赞 Willeke 10/31/2023
好点子。菜单项是否始终处于启用状态?是否已实施?还有其他撤消管理器 ()?请发布一个最小的可重复示例undo:NSTextView
0赞 silverdr 10/31/2023
菜单项始终处于启用状态。没有实现“自定义”。它转到第一响应者,这应该是窗口。我不知道任何其他撤消管理器。XIB 中有一些 s,但没有 s。发布示例可能不可行,因为应用程序相对复杂。我会看看我是否可以在应用程序环境之外以某种方式重现它,但不能打赌undo:NSTextFieldNSTextView

答:

0赞 silverdr 11/6/2023 #1

万一其他人像我一样在这条路上浪费了那么多时间......

在这种特殊情况下观察到不当行为的原因是包含“撤消”和“重做”的“编辑”没有设置/选中“自动启用项目”。在Interface Builder中选中相应的复选框后,不仅两个菜单项都开始被正确禁用/启用,而且它们的文本内容也开始根据调用进行调整。NSMenuNSMenuItemNSUndoManagersetActionName:(NSString *)name