2011-01-31 39 views
6

Tôi muốn thêm trình quản lý hoàn tác vào ứng dụng iPhone được lưu trữ coredata. Khi người dùng cố gắng thêm một đối tượng mới (bằng cách nhấn vào nút +), tôi tải một bộ điều khiển chế độ xem mới và bắt đầu một nhóm hoàn tác mới trong viewDidLoad.Nhóm hoàn tác lồng nhau với CoreData

Khi người dùng nhấn nút Hủy, tôi muốn khôi phục các thay đổi trong hủyHành động gọi lại.

Queries:

  1. Có thể bắt đầu một nhóm Undo lồng và kiên trì vượt qua vòng lặp sự kiện và đối chiếu tất cả các thay đổi được thực hiện trong một nhóm undo duy nhất? Ngay bây giờ, khi tôi gọi beginUndoGrouping trong cancelAction, tôi nhận được một ngoại lệ startUndoGrouping bị thiếu.
  2. Ý nghĩa của API nhómByEvent cho NSUndoManager là gì? Tôi có cần phải đặt nó thành NO để duy trì một nhóm hoàn tác thông qua vòng lặp sự kiện không?
  3. Điều gì cần được thực hiện trong lời gọi hành động saveAction để thực hiện thay đổi vĩnh viễn (ngoài việc gọi điện lưu trên mangedObjectContext)? Làm cách nào để tôi cho Trình quản lý hoàn tác ngừng theo dõi các thay đổi?

Thông báo lỗi:

* Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInternalInconsistencyException', lý do: '_endUndoGroupRemovingIfEmpty :: NSUndoManager 0x75415f0 ở trạng thái không hợp lệ, endUndoGrouping gọi mà không có khớp bắt đầu

Sample Mã số:

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

Trả lời

7

Bắt đầu với câu hỏi cụ thể của bạn - Có, bạn có thể tự def ine các giới hạn của một hoạt động hoàn tác bằng cách sử dụng beginUndoGrouping và endUndoGrouping.

Trong trường hợp này, thao tác hoàn tác phải hoạt động có hay không nhóm groupsByEvent được đặt. Điều này là do tất cả các nhóm hoàn tác được tạo bởi vòng lặp sự kiện được lồng trong nhóm mở hoàn tác chính của bạn bắt đầu với beginUndoGrouping và miễn là bạn gọi undoNestedGroup trực tiếp sau khi bạn gọi endUndoGrouping, nó sẽ hoạt động. Nếu bạn không sử dụng vòng lặp sự kiện hoàn tác các nhóm, đừng lo lắng về nó và đặt nó thành NO.

Để thực hiện thay đổi của bạn vĩnh viễn, hãy đóng nhóm hoàn tác với endUndoGrouping và gọi lưu vào ngữ cảnh của bạn. Các cuộc gọi processPendingChanges không cần thiết và có thể gây ra các vấn đề trong các nhóm lồng nhau. Nếu bạn muốn xóa các hoạt động hoàn tác, hãy gọi removeAllActions trên trình gỡ cài đặt của bạn sau khi endUndoGrouping - điều này đảm bảo rằng các thay đổi sẽ không bao giờ được thực hiện.

Sử dụng điểm ngắt/nslog để đảm bảo các cuộc gọi bắt đầu/kết thúc của bạn là một cho một.

Nếu bạn muốn hủy bỏ của bạn hành động được như một 'nút hoàn tác', bạn sẽ phải làm như sau:

  • Move beginUndoGrouping để viewWillAppear

  • Gọi endUndoGrouping trong viewWillDisappear

  • mở lại hoàn tác nhóm khi kết thúc hành động hủy của bạn

  • mở lại undo nhóm vào cuối lưu hành động của bạn

Ngược lại, nếu bạn để nó như là, chắc chắn rằng bạn đóng hộp thoại trong bạn lưu và hủy bỏ hành động, để tránh khả năng endUndoGrouping được gọi nhiều lần.

Nếu bạn có bất kỳ câu hỏi nào, vui lòng nhận xét và tôi sẽ cập nhật.

Chúc may mắn!

Các vấn đề liên quan