2009-04-23 5 views
8

In meinem Core Data-Modell habe ich eine Beziehung mit dem Namen listItems, die auf mehrere listItem Einheiten mit jeweils einem stringValue-Attribut verknüpft. Ich habe ein Steuerelement erstellt, das im Wesentlichen eine Liste von NSTextFields ist, eins für jedes Listenelement. Das Steuerelement ist ordnungsgemäß an listItems gebunden, und ich habe es so eingerichtet, dass beim Drücken der Eingabetaste ein neues Feld direkt unter dem aktuell bearbeiteten Feld erstellt wird und der Fokus auf das neue Feld geändert wird. Um also einen neuen Eintrag hinzuzufügen, drückt der Benutzer die Eingabetaste.Deaktivieren Sie zum Erstellen/Löschen von NSManagedObject Rückgängig

Ebenso, wenn der Benutzer die Bearbeitung beendet und das aktuell bearbeitete Feld leer ist, wird das Feld entfernt (wie in, leere Felder erscheinen nur sozusagen im "Bearbeitungsmodus"). Das funktioniert ziemlich gut. Im Grunde genommen in meiner listItem NSManagedObject Unterklasse, ich folgende tun:

// 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 

Das Problem, das mir begegnet ist, ist, dass jedes Mal, wenn eine Zeile auf diese Weise gelöscht wird, es mit dem undoManager registriert. Wenn Sie also eine Zeile bearbeiten, drücken Sie die Eingabetaste (wodurch eine neue Zeile erstellt wird) und klicken Sie auf Weiter, um die Bearbeitung zu beenden. Die Zeile wird ausgeblendet. Wenn ich dann rückgängig mache, erscheint das leere Feld wieder. Mein Ziel ist es, Löschoperationen mit leeren Feldern vom UndoManager zu ignorieren.

Wie würde ich darüber gehen? Ich habe versucht, [[[self managedObjectContext] undoManager] disableUndoRegistration] und die dazugehörigen enableUndoRegistration an mehreren Stellen (zB -didTurnIntoFault, aber ich vermute, dass die Undo-Anmeldung vor diesem Verfahren könnte geschieht)

Antwort

18

Wenn Sie tiefer in die Core Data docs tauchen Sie‘ ll diese tidbit weg versteckt finden:

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

Änderungen werden mit dem Undo-Manager normalerweise bis zum Ende der Ereignisschleife nicht registriert, und so registriert werden, wurden nach Sie Undo-Registrierung auf der Rückseite gedreht würde. Das obige erzwingt, dass es auftritt, wenn Sie möchten.

Verwandte Themen