2009-04-23 31 views
8

Trong mô hình Dữ liệu cốt lõi của tôi, tôi có mối quan hệ được gọi là listItems liên kết với một số thực thể listItem, mỗi đối tượng có thuộc tính stringValue. Tôi đã tạo một điều khiển về bản chất là một danh sách của NSTextFields, một cho mỗi mục danh sách. Điều khiển được gắn với listItems đúng cách và tôi đã thiết lập nó để nhấn phím trả về tạo trường mới ngay dưới trường hiện được chỉnh sửa và thay đổi tiêu điểm sang trường mới. Vì vậy, về cơ bản, để thêm một mục mới, người dùng nhấn Return. Tương tự, nếu người dùng kết thúc chỉnh sửa và trường hiện đang chỉnh sửa trống, trường sẽ bị xóa (như trong, các trường trống chỉ xuất hiện trong "chế độ chỉnh sửa", để nói). Điều này hoạt động khá tốt. Về cơ bản, trong listItem NSManagedObject lớp con của tôi, tôi làm như sau:Tắt hoàn tác việc tạo/xóa NSManagedObject

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

Vấn đề tôi đang gặp là mỗi lần liên tiếp được xóa theo cách này, nó đăng ký với undoManager. Do đó, nếu tôi chỉnh sửa hàng, nhấn Return (tạo hàng mới) và nhấp chuột để kết thúc chỉnh sửa, hàng sẽ biến mất. Tuy nhiên, nếu sau đó tôi hoàn tác, trường trống sẽ xuất hiện trở lại. Mục tiêu của tôi là xóa các thao tác liên quan đến các trường trống được bỏ qua bởi undoManager.

Tôi sẽ làm như thế nào? Tôi đã thử sử dụng [[[self managedObjectContext] undoManager] disableUndoRegistration] và liên kết enableUndoRegistration ở một số điểm (chẳng hạn như -didTurnIntoFault, nhưng tôi nghi ngờ rằng đăng ký hoàn tác có thể xảy ra trước phương pháp đó)

Trả lời

18

Nếu bạn đi sâu hơn vào tài liệu Dữ liệu cốt lõi, bạn ' sẽ tìm thấy miếng ngon này ẩn đi:

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

Thay đổi chưa đăng ký với người quản lý undo bình thường cho đến khi kết thúc vòng lặp sự kiện, và do đó đã được đăng ký sau bạn muốn quay đăng ký lùi trở lại. Các lực lượng trên nó xảy ra khi bạn muốn.