Подтвердить что ты не робот

Как отменить/повторить работу в основном на iPhone OS?

Мое приложение еще не использует Core Data. Верно ли, что я должен использовать Core Data для отмены/повтора?

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

4b9b3361

Ответ 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, которые отменяют изменения этих свойств.

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

На 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 becomeFirstResponder] в -loadView или -viewDidLoad, но я обнаружил, что контроллеры представлений, которые появляются на экране сразу после запуска, должны иметь это сообщение для задержки, чтобы он работал:

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

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