Как отмена/восстановление в основном работает над iPhone OS?

Мое приложение еще не использует Базовые Данные. Действительно ли это верно, что я должен использовать Базовые Данные для отмены/восстановления?

И: Как пользователь делает отмену/восстановление? Я никогда не видел его в действии и никогда не использовал его. Не знайте, как я должен сделать это, если бы я хотел. Нигде нет никакой кнопки отмены/восстановления. Все же они говорят, что это имеет отмену/восстановление. Таким образом, как пользователь инициировал это?

12
задан Brad Larson 24 October 2011 в 01:56
поделиться

1 ответ

iPhone OS 3.0 перенесла концепцию NSUndoManager из Mac, которая позволяет выполнять отмену на iPhone. NSUndoManager поддерживает стек NSInvocations, которые являются действиями, противоположными любым правкам или другим изменениям, которые вы делаете. Например,

- (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"];
}

можно использовать для наблюдения за изменениями свойств, создавая обратные вызовы NSInvocations, которые отменяют изменения этих свойств.

Core Data не требуется для отмены, но это делает ее намного, намного проще. Он обрабатывает создание этих действий отмены для вас каждый раз, когда вы редактируете свою модель данных, включая сложные действия, такие как каскадное удаление вниз по иерархии управляемых объектов.

На iPhone, чтобы включить отмену / возврат, необходимо настроить несколько параметров. Во-первых, NSManagedObjectContexts на iPhone по умолчанию не имеет диспетчера отмены, поэтому вам нужно его создать:

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

Этот код обычно идет сразу после того, где вы бы создали свой NSManagedObjectContext.

После того, как для вашего контекста будет предоставлен менеджер отмены, вам необходимо включить жест по умолчанию для отмены на iPhone, встряхивание устройства.Чтобы ваше приложение обрабатывало этот жест автоматически, поместите следующий код в метод -applicationDidFinishLaunching: в делегате приложения:

application.applicationSupportsShakeToEdit = YES;

Наконец, вам нужно будет настроить каждый контроллер представления, который будет способен обрабатывать жест встряхивания для отмены. Эти контроллеры представлений должны будут сообщать диспетчеру отмены, который будет использоваться для этого контроллера, переопределив метод -undoManager :

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

Контроллеры представления также должны быть в состоянии стать первым респондентом для обработки жестов, поэтому необходим следующий метод:

- (BOOL)canBecomeFirstResponder 
{
    return YES;
}

Контроллер представления должен будет стать первым респондентом, когда он появится на экране. Это можно сделать, вызвав [self статьFirstResponder] в -loadView или -viewDidLoad , но я обнаружил, что контроллеры представления, которые появляются на экране сразу после запуска, должны отложите это сообщение немного, чтобы оно работало:

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

Со всем этим вы должны получить автоматическую поддержку отмены и повтора, любезно предоставленную Core Data, с красивым анимированным меню.

35
ответ дан 2 December 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: