2011-01-31 17 views
6

Chcę dodać menedżera cofania do aplikacji iPhone wspieranej przez coredaty. Kiedy użytkownik próbuje dodać nowy obiekt (dotykając przycisku +), ładuję nowy modalny kontroler widoków i uruchamiam nową grupę cofania w viewDidLoad.Zagnieżdżona grupa cofania z CoreData

Gdy użytkownik naciśnie przycisk Anuluj, chcę wycofać zmiany w wywołaniu zwrotnym cancelAction.

Zapytania:

  1. Czy to możliwe, aby rozpocząć zagnieżdżone grupy Cofnij i utrzymywać ją przez pętlę zdarzeń i zestawia wszystkie zmiany wykonane w jednej grupie cofania? Teraz, gdy wywołuję funkcję beginUndoGrouping w cancelAction, otrzymuję brakujący wyjątek beginUndoGrouping.
  2. Jakie jest znaczenie API groupsByEvent dla NSUndoManager? Czy muszę ustawić go na NIE, aby utrzymać grupę cofania w pętli zdarzeń?
  3. Co należy zrobić w wywołaniu zwrotnym saveAction, aby dokonać zmian na stałe (oprócz wywołania save on mangedObjectContext)? Jak powiadomić Menedżera cofania o zaprzestaniu śledzenia zmian?

Komunikat o błędzie:

* Zakończenie aplikację spowodowane nieprzechwyconego wyjątku 'NSInternalInconsistencyException', powód: „_endUndoGroupRemovingIfEmpty :: NSUndoManager 0x75415f0 jest w nieprawidłowym stanie, endUndoGrouping nazywany bez dopasowywania rozpocząć

Sample Kod:

// RootViewController.m 
- (void) addAction { 
    // Load Modal View Controller to add new object 

} 

// AddViewController.m 
- (void) viewDidLoad { 
    // Start nested undo group 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager beginUndoGrouping]; 

    [self createModel]; 

} 

- (void) cancelAction { 
    // Revert all changes 
    [self.managedObjectContext processPendingChanges]; 
    [self.managedObjectContext.undoManager endUndoGrouping]; 

    [self.managedObjectContext.undoManager undoNestedGroup]; 

    ... 
} 

- (void) saveAction { 

    // Save changes 
} 

Odpowiedz

7

Począwszy od konkretnych pytań - Tak, można ręcznie def ine granic operacji cofania przy użyciu funkcji beginUndoGrouping i endUndoGrouping.

W tym przypadku operacja cofania powinna działać niezależnie od tego, czy ustawiono groupByEvent. Dzieje się tak dlatego, że wszystkie grupy cofania, które są generowane przez pętlę zdarzeń, są zagnieżdżane w głównej grupie otwartych operacji cofania rozpoczętej za pomocą funkcji beginUndoGrouping i tak długo, jak wywołuje się funkcję undoNestedGroup bezpośrednio po wywołaniu metody endUndoGrouping, powinna ona działać. Jeśli nie używasz grupowania cofania pętli zdarzeń, nie przejmuj się tym i ustaw na NIE.

Aby wprowadzić zmiany na stałe, zamknij grupę cofania za pomocą funkcji endUndoGrouping i zapisz wywołanie w kontekście. Wywołania processPendingChanges nie są potrzebne i mogą powodować problemy w zagnieżdżonych grupach. Jeśli chcesz wyczyścić operacje cofania, wywołaj removeAllActions na undomanager po endUndoGrouping - to gwarantuje, że zmiany nigdy nie zostaną anulowane.

Użyj punktów przerwania/nslog, aby upewnić się, że twoje początkowe/końcowe połączenia są jedno za jedno.

Jeśli chcesz anulować swoje działania, aby być jak 'przycisk cofnij', musisz wykonać następujące czynności:

  • Move beginUndoGrouping do viewWillAppear

  • połączenia endUndoGrouping w viewWillDisappear

  • ponownie otwórz grupowanie cofnij na końcu anulowania

  • ponowne otwarcie cofnąć grupowanie w końcu zapisać działania

W przeciwnym razie, jeśli pozostawić ją w takim stanie, upewnij się zamknąć okno w swoim oszczędzania i anulować działań, aby uniknąć możliwości endUndoGrouping jest nazywany wielokrotnie.

Jeśli masz jakiekolwiek pytania, prosimy o komentarz, a ja zaktualizuję.

Powodzenia!