2011-01-14 7 views
0

Ich habe ein verwaltetes Objekt mit mehreren Mitgliedern von NSNumber in meiner iPhone App erstellt. Ich initialisiere diese Werte. Ich erstelle auch ein Unterobjekt Mitglied. Dann erstelle ich einen Rückgängig-Manager, damit ich Operationen für das Unterobjekt rückgängig machen kann, ohne die initialisierten Parameter rückgängig zu machen. Allerdings, wenn ich meine App starte und anrufe ...Warum kann NSUndoManager canUndo JA?

[undoManager canUndo]; 

... es ist "JA". Wie kann das sein? Die Datenelemente der obersten Ebene werden auf Null zurückgesetzt. Nicht nur das, aber der managedObjectContext von Unterobjekt ist Null. Wie kann das sein, wenn das Unterobjekt vor der Erstellung des Undo-Managers erstellt wird. Ist der Undo-Manager rückwirkend? Es scheint, das Rückgängigmachen des gesamten verwalteten Objekts zuzulassen, obwohl diese Datenelemente VOR dem Erstellen des Rückgängig-Managers festgelegt sind.

Jeder Einblick wird geschätzt.

+0

NSManagedObjectContext erstellt seinen eigenen Undo-Manager. Verwenden Sie disableUndoRegistration und enableUndoRegistration, um zu verhindern, dass bestimmte Dinge rückgängig gemacht werden. – ughoavgfhw

+0

@ughoavgfhw: Nicht wahr in iOS-Plattformen! – Felix

+0

Ich folgte dem Beispiel von CoreDataBooks für iPhone. Was verwirrend ist, ist, dass canUndo nach dem Erstellen des Undo-Managers NEIN zurückgibt und auch NO in der viewWillAppear-Methode zurückgibt (ich habe jeden anderen Code auskommentiert, der das Objekt beeinflusst). Aber wenn ich auf die Rückgängig-Schaltfläche klicke, wird JA zurückgegeben. Wie kann das sein? – Christopher

Antwort

1

Es scheint, dass wenn ein verwaltetes Objekt nicht gespeichert wird, die Erstellung eines NSUndoManager auf das vorhandene Objekt angewendet wird und das Rückgängigmachen von Änderungen am Objekt ermöglicht wird. Ich habe dies gefunden, indem ich einfach das Objekt vor der Anzeige gespeichert habe, da das Objekt aus Optionen auf verschiedenen Bildschirmen erstellt wurde. Wenn ich nach dem Speichern des Objekts versuchen, rückgängig zu machen, gibt canUndo wie erwartet NEIN zurück.

Eine andere Option ist es, removeAllActions auf dem Undo-Manager aufzurufen, nachdem die Ansicht angezeigt wird, aber dies wäre problematisch, weil es zu viele Einstiegspunkte gibt. Jetzt, da das Objekt gespeichert ist, lösche ich es, wenn der Benutzer abbricht.

Ich hoffe, das hilft jemandem in der Zukunft.

0

Die Registrierung der Änderungen am Undo-Manager wird zurückgestellt. Sie müssen sicherstellen, dass Änderungen verarbeitet werden, bis Sie den Rückgängig-Manager festlegen. Sie können die processPendingChanges-Methode verwenden. Hier ein kleines Beispiel:

// create initial objects 
[managedObjectContext processPendingChanges]; 

// enable undo 
managedObjectContext.undoManager = undoManager; 
Verwandte Themen