【问题标题】:Undo action names for Core Data changes撤消核心数据更改的操作名称
【发布时间】:2011-08-07 11:13:04
【问题描述】:

我正在寻找一种内置(或易于实现)的方法来让 Core Data 撤消/重做操作名称读起来像“撤消编辑名字”,而不是简单的“撤消”或“重做”就像他们默认的那样。

我有一个Core Data 应用程序,并使用它的NSUndoManager 作为我窗口的撤消管理器。它工作得很好,但是当用户对字段进行更改时(从NSTableView 内联),撤消菜单项的标题不会反映更改了哪个字段。

最初的搜索让我找到了 2007 年 1 月在 Apple Mailing Lists 上发布的相同问题。发布的唯一答案是“在核心数据编程指南中搜索'Model.strings'。”我的模型没有字符串文件,所以我创建了一个(本地化在我的 en.lproj 目录中并使用 UTF-16 编码),但这并没有什么区别。

我遵循了 Apple 的 tutorial(由于我的应用不是基于文档的应用而略有调整)和 Core Data documentation 的说明,但我的菜单标题仍然是“撤消”和“重做”。

【问题讨论】:

    标签: objective-c cocoa macos core-data nsundomanager


    【解决方案1】:

    在你的 NSManagedObject 子类中添加

    -(void)setValue:(id)value forKey:(NSString *)key
    {
        NSUndoManager * aUM = [[self managedObjectContext] undoManager];
        [super setValue:value forKey:key];
        if ([aUM isUndoRegistrationEnabled])
            [aUM setActionName:NSLocalizedString(key,nil)];
    }
    

    【讨论】:

    • 您的示例中的 NSLocalizedString 调用将不起作用,因为它不会查找 Model.strings 文件。您将如何在运行时查找字段的本地化名称?
    • 我将以上内容作为一个单独的问题发布:stackoverflow.com/q/5790296/105717
    • 我还相应地修改了您的 if 语句:if ([aUM isUndoRegistrationEnabled] && ![aUM isUndoing] && ![aUM isRedoing]) 以避免每次执行撤消或重做时出现重复条目​​。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2010-11-17
    • 2014-12-21
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多