代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

禁用撤消以创建/删除nsmanagedObject

  •  8
  • Matt Ball  · 技术社区  · 15 年前

    在我的核心数据模型中,我有一个关系叫做 listItems 哪个链接到几个 listItem 实体,每个实体 stringValue 属性。我创建了一个控件,它本质上是 NSTextFields ,每个列表项一个。控件绑定到 李斯特 正确地说,我已经设置好了,这样按下返回键就可以直接在当前编辑的字段下创建一个新字段,并将焦点更改为新字段。因此,本质上,要添加一个新项目,用户按回车键。

    同样,如果用户结束编辑,当前编辑的字段为空,则该字段将被删除(如中所述,空字段仅在“编辑模式”期间出现,也就是说)。这很管用。基本上,在我的 李斯特 nsmanagedObject子类,我执行以下操作:

    // Don't allow nil values
    if (!value && [[self.recipe ingredients] count] > 1) {
        for (EAIngredientRef *ingredient in [self.recipe ingredients]) {
            if ([[ingredient sortIndex] integerValue] > [[self sortIndex] integerValue]) {
                [ingredient setSortIndex:[NSNumber numberWithInteger:([[ingredient sortIndex] integerValue]-1)]];
            }
        }
        [[self managedObjectContext] deleteObject:self];
        return;
    }
    
    // Code to handle if it is a real value
    

    我遇到的问题是,每当以这种方式删除一行时,它都会向UndoManager注册。因此,如果编辑一行,请按回车键(这将创建一个新行),然后单击离开以结束编辑,该行将消失。但是,如果我随后撤销,空字段将重新出现。我的目标是让UndoManager忽略涉及空字段的删除操作。

    我该怎么办?我试过用 [[[self managedObjectContext] undoManager] disableUndoRegistration] 以及 enableUndoRegistration 在几个地方(如 -didTurnIntoFault ,但我怀疑撤消注册可能发生在该方法之前)

    1 回复  |  直到 15 年前
        1
  •  19
  •   Mike Abdullah    15 年前

    如果你更深入地研究核心数据文档,你会发现这条信息被隐藏起来:

    [[self managedObjectContext] processPendingChanges];
    [[[self managedObjectContext] undoManager] disableUndoRegistration];
    // Do your work
    [[self managedObjectContext] processPendingChanges];
    [[[self managedObjectContext] undoManager] enableUndoRegistration];
    

    在事件循环结束之前,通常不会向撤消管理器注册更改,因此正在注册更改。 之后 您已重新打开撤消注册。上面强制它在需要时发生。