【问题标题】:Multiple undo managers for a text view文本视图的多个撤消管理器
【发布时间】:2010-03-21 17:07:37
【问题描述】:

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

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

策略性地放置日志语句告诉我一切都按计划进行:在启动时,一个新的模型对象被正确初始化,并且文本视图总是拉出一个非空的撤消管理器。但是在实际执行撤消操作时,我无法获得我想要的行为。

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

文档中的Something 让我挑了挑眉,因为这意味着我无法对多个模型对象进行撤消:

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

【问题讨论】:

    标签: cocoa nstextview nsattributedstring nsundomanager


    【解决方案1】:

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

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

    【讨论】:

    • 我想我会选择 Core Data。如果我将我的模型对象变成一个托管实体,我将免费获得撤消。
    • 您的方法似乎运行良好,无需向应用程序添加核心数据。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多