8

私の Core Data モデルには、それぞれが属性を持つ複数のエンティティにlistItemsリンクするという関係があります。基本的にリスト項目ごとにのリストであるコントロールを作成しました。コントロールは適切にバインドされており、リターン キーを押すと、現在編集中のフィールドのすぐ下に新しいフィールドが作成され、フォーカスが新しいフィールドに変更されるように設定しました。したがって、基本的に、新しい項目を追加するには、ユーザーは Return キーを押します。listItemstringValueNSTextFieldslistItems

同様に、ユーザーが編集を終了し、現在編集中のフィールドが空の場合、そのフィールドは削除されます (空のフィールドは、いわば「編集モード」の間のみ表示されます)。これはかなりうまくいきます。基本的に、私のlistItemNSManagedObject サブクラスでは、次のことを行います。

// 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 に登録されることです。したがって、行を編集し、(新しい行を作成する) Return キーを押し、別の場所をクリックして編集を終了すると、その行は消えます。ただし、元に戻すと、空のフィールドが再び表示されます。私の目標は、空のフィールドを含む削除操作が undoManager によって無視されるようにすることです。

これについてどうすればいいですか?と をいくつかの場所で使用してみました[[[self managedObjectContext] undoManager] disableUndoRegistration](enableUndoRegistrationなど-didTurnIntoFault、そのメソッドの前に元に戻す登録が行われている可能性があります)。

4

1 に答える 1

19

Core Data ドキュメントをさらに深く掘り下げると、次の情報が隠されていることがわかります。

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

変更は通常、イベント ループが終了するまで元に戻すマネージャーに登録されないため、元に戻す登録をオンに戻した後に登録されていました。上記は、必要なときに強制的に発生させます。

于 2009-04-23T07:41:54.480 に答える