Frage

Ich habe ein Core Data dokumentenbasierte App, die rückgängig gemacht werden unterstützt / Redo über die eingebauten in NSUndoManager mit dem NSManagedObjectContext verbunden. Ich habe ein paar Aktionen einrichten, die in Core Data zahlreiche Aufgaben, wickeln alle diese Aufgaben in eine Undo-Gruppe über beginUndoGrouping / endUndoGrouping, und werden von der NSUndoManager verarbeitet werden.

Rückgängig funktioniert. Ich kann mehrere aufeinander folgende Aktionen ausführen, und jede rückgängig machen dann jeder von ihnen nacheinander und Zustand meiner App richtig gehalten wird. Allerdings ist der „Redo“ Menüpunkt nie aktiviert. Dies bedeutet, dass das NSUndoManager das Menü sagt, dass es keine Einzelteile sind zu wiederholen.

Ich frage mich, warum die NSUndoManager scheinbar vergessen über Gegenstände, sobald sie wieder rückgängig gemacht werden, und nicht so dass Nacharbeiten auftreten?

Eine Sache, die ich erwähnen sollte, ist, dass ich zu deaktivieren bin rückgängig machen Registrierung nach dem Öffnen eines Dokuments / erstellt. Wenn ich eine Aktion ausführen, nenne ich enableUndoRegistration, beginUndoGrouping, führen Sie die Aktion, dann rufen processPendingChanges, setActionName:, endUndoGrouping und schließlich disableUndoRegistration. Dies stellt sicher, dass nur bestimmte Aktionen rückgängig gemacht werden, und andere Daten, Änderungen, die ich außerhalb davon machen gehen Sie auf die NSUndoManager unbemerkt. Dies kann ein Teil des Problems sein, aber wenn so frage ich mich, warum es Redo beeinflussen?

Vielen Dank im Voraus.

War es hilfreich?

Lösung 2

Ich habe dieses Problem behoben von:

Keeping Registrierung rückgängig machen aktivierte die ganze Zeit, mit Ausnahme der Zeiten, in denen ich ausdrücklich nicht will undos aufzunehmen.

Ich habe gelernt, dass:

Wenn Sie die Registrierung aktivieren rückgängig machen, kurz bevor Änderungen durchführen, die Sie aufnehmen möchten, und deaktivieren Sie unmittelbar nach dem diese Änderungen kommen, die Redo-Stack des NSUndoManager nie bevölkert wird.

Also, nie disableUndoRegistration nennen.

Andere Tipps

Eigentlich solange Sie enableUndoRegistration rufen sowohl vor -undo und -redo (und disableUndoRegistration nach ihnen), können Sie erreichen, was Sie waren nach.

Ich glaube, dass Sie nur aktivieren wurden Aufruf (/ deaktivieren) UndoRegistration vor und nach den Änderungen an verwalteten Objekten. Dies bedeutet, dass Ihre ‚Undo‘ nicht mit dem Undo-Manager registriert wurde, und daher konnte man nicht ‚Redo‘ es.

Ich rief disableUndoManager beim Halten „Wiederherstellen“ aktiviert. Um dies zu tun subclassed ich NSUndoManager und enthalten diese Methode:

-(void) undo
{
  [[appDelegate managedObjectContext] processPendingChanges];
  [self enableUndoRegistration];
  [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
  [super undo];
  [[appDelegate managedObjectContext] processPendingChanges];
  [self disableUndoRegistration];
}

Wie stefanf in NSUndoManager, Core Data und selektiv angegeben Undo / Redo : „NSUndoManager für den nächsten Lauf Schleifenzyklus warten, bis er die Änderungen registriert“

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top