2010-03-15 24 views
12

Ứng dụng của tôi chưa sử dụng Dữ liệu cốt lõi. Có đúng là tôi phải sử dụng Dữ liệu cốt lõi để hoàn tác/làm lại không?Làm cách nào để hoàn tác/làm lại cơ bản trên iPhone OS?

Và: Làm cách nào để người dùng thực hiện hoàn tác/làm lại? Tôi chưa bao giờ thấy nó hoạt động và chưa bao giờ sử dụng nó. Không biết làm thế nào tôi nên làm điều đó nếu tôi muốn. Không có nút hoàn tác/làm lại ở bất cứ đâu. Tuy nhiên, họ nói nó đã hoàn tác/làm lại. Vậy người dùng kích hoạt điều này như thế nào?

Trả lời

35

Hệ điều hành iPhone 3.0 mang khái niệm về NSUndoManager từ máy Mac, đây là thứ cho phép hoàn tác trên iPhone. NSUndoManager duy trì một chồng NSInvocations là các hành động ngược lại đối với bất kỳ chỉnh sửa nào hoặc các thay đổi khác mà bạn thực hiện. Ví dụ:

- (void)observeValueForKeyPath:(NSString*)keyPath 
         ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    NSUndoManager *undo = [self undoManager]; 
    // Grab the old value of the key 
    id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; 
    // Add edit item to the undo stack 
    [[undo prepareWithInvocationTarget:self] changeKeyPath:keyPath 
                ofObject:object 
                toValue:oldValue]; 
    // Set the undo action name in the menu 
    [undo setActionName:@"Edit"]; 
} 

có thể được sử dụng để quan sát các thay đổi về thuộc tính, tạo nghịch đảo NSInvocations sẽ hoàn tác chỉnh sửa đối với các thuộc tính đó.

Dữ liệu cốt lõi là không cần thiết để hoàn tác, nhưng nó làm cho nó dễ dàng hơn nhiều. Nó xử lý việc tạo ra các hành động hoàn tác này cho bạn mỗi khi bạn chỉnh sửa mô hình dữ liệu của mình, bao gồm các hành động phức tạp như tầng tầng xóa một hệ thống phân cấp của các đối tượng được quản lý.

Trên iPhone, để bật hoàn tác/làm lại, bạn cần thiết lập một vài điều. Thứ nhất, NSManagedObjectContexts trên iPhone không có một người quản lý undo theo mặc định, vì vậy bạn cần phải tạo ra một:

NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init]; 
[contextUndoManager setLevelsOfUndo:10]; 
[managedObjectContext setUndoManager:contextUndoManager]; 
[contextUndoManager release];  

Mã này thường sẽ đi ngay sau khi bạn đã có thể tạo ra NSManagedObjectContext của bạn.

Khi người quản lý hoàn tác được cung cấp cho ngữ cảnh của bạn, bạn cần bật cử chỉ mặc định để hoàn tác trên iPhone, rung lắc thiết bị. Để cho phép ứng dụng của bạn xử lý cử chỉ này tự động, đặt đoạn mã sau trong phương pháp -applicationDidFinishLaunching: trong đại biểu ứng dụng của bạn:

application.applicationSupportsShakeToEdit = YES; 

Cuối cùng, bạn sẽ cần phải thiết lập từng điều khiển điểm cho rằng sẽ có khả năng xử lý các cử chỉ lắc cho hủy bỏ. Những bộ điều khiển xem sẽ cần phải báo cáo lại người quản lý undo để sử dụng cho bộ điều khiển bằng cách ghi đè các -undoManager phương pháp:

- (NSUndoManager *)undoManager; 
{ 
    return [[[MyDatabaseController sharedDatabaseController] scratchpadContext] undoManager]; 
} 

Quan điểm điều khiển cũng sẽ cần để có thể trở thành responder đầu tiên để xử lý những cử chỉ, vì vậy sau phương pháp là cần thiết:

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

Trình điều khiển chế độ xem sẽ cần phải trở thành người trả lời đầu tiên khi xuất hiện trên màn hình. Điều này có thể được thực hiện bằng cách gọi [self becomeFirstResponder] trong -loadView hoặc -viewDidLoad, nhưng tôi đã tìm thấy rằng quan điểm điều khiển mà xuất hiện trên màn hình ngay sau khi ra mắt cần phải có thông báo này chậm một chút để cho nó làm việc:

[self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.3]; 

Với tất cả điều này tại chỗ, bạn sẽ nhận được tự động hoàn tác và làm lại hỗ trợ lịch sự của Core Data, với một menu hoạt hình đẹp.

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