用于文本视图的多个撤消管理器

时间:2010-03-21 17:07:37

标签: cocoa nstextview nsattributedstring nsundomanager

我有一个文本视图,它从存储在模型对象中的属性字符串中获取其内容。我在抽屉中列出了其中几个模型对象,当用户点击其中一个时,文本视图会交换其内容。

我现在还需要将撤消管理器交换为文本视图。我在我的模型对象上初始化一个撤消管理器,并使用undoManagerForTextView将它返回到文本视图,但是有些东西不太正确。

策略性地放置日志记录语句向我显示所有内容都按计划运行:在启动时,正确初始化新模型对象,并且文本视图始终提取非空撤消管理器。但是当涉及到实际进行撤消时,我无法得到我想要的行为。

我打开一个窗口,输入内容并按下cmd + z,然后撤消工作。 我打开一个窗口,输入一些东西,在桌子上选择一个新模型,输入一些东西,回到第一个模型并尝试撤消,我得到的只是一声哔哔声。

文档上的

Something让我引起了一阵惊讶,因为这意味着我无法撤消几个模型对象:

  

默认的撤消和重做行为   适用于文本字段和文本   细胞只要是田地或细胞   第一响应者(即第一响应者)   键盘动作的重点)。一旦   插入点离开场或   细胞,先前的操作不能   撤消。

1 个答案:

答案 0 :(得分:2)

您可能希望继承NSUndoManager并覆盖removeAllActionsWithTarget:removeAllActions,至少要记录它们,可能会使它们成为无操作。

不要忘记实例化您的子类而不是原始的NSUndoManager。 (容易忘记,有些读者可能没有意识到他们需要这样做。)