Отслеживание изменений и операции отмены

Saveless-особенность-модели UIDocument класс гарантирует, что данные документа автоматически сохраняются через короткие интервалы, освобождая пользователей потребности явно сохранить их документы. UIDocument реализации большая часть поведения для saveless модели, но основанное на документе приложение должна играть свою собственную роль, чтобы заставить функцию работать.

Как UIKit сохраняет данные документа автоматически

saveless модель, реализованная платформой UIKit для документов, имеет две основных части: механизм для маркировки документа как бывший должный быть сохраненным и переменный период для того, когда платформа проверяет тот флаг. Периодически, UIKit вызывает hasUnsavedChanges метод a UIDocument возразите и оценивает возвращенное значение. Если значение YES, это сохраняет данные документа к файлу документа. Период между проверками hasUnsavedChanges значение варьируется согласно нескольким факторам, включая уровень ввода пользователем.

Основанное на документе приложение устанавливает значение, возвращенное hasUnsavedChanges косвенно, или путем реализации отмены и восстановления или путем отслеживания изменений в документе. Отслеживание изменений требует, чтобы приложение вызвало updateChangeCount: метод, передающий в UIDocumentChangeDone (константа типа UIDocumentChangeKind). Когда приложение регистрирует действие отмены и затем отправляет undo или redo сообщения менеджеру по отмене документа, UIDocument вызовы updateChangeCount: от своего лица.

Поскольку, давая пользователям возможность отменить и восстановить изменения может быть дифференцирующейся функцией, тот подход рекомендуется для большинства приложений.

Реализация отмены и восстановления

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

Перечисление 5-1 иллюстрирует реализацию отмены и восстановления для текстового поля.

Перечисление 5-1  Реализовывая отмену и восстановление для текстового поля

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.undoButton.enabled = YES;
    self.redoButton.enabled = YES;
 
    if (textField.tag == 1) {
        [self setLocationText:textField.text];
    }
    // code for other text fields here....
}
 
- (void)setLocationText:(NSString *)newText {
    NSString *currentText = _document.location;
    if (newText != currentText) {
        [_document.undoManager registerUndoWithTarget:self
            selector:@selector(setLocationText:)
            object:currentText];
        _document.location = newText;
        self.locationField.text = newText;
    }
}
 
- (IBAction)handleUndo:(id)sender {
    [_document.undoManager undo];
    if (![_document.undoManager canUndo]) self.undoButton.enabled = NO;
}
 
- (IBAction)handleRedo:(id)sender {
    [_document.undoManager redo];
    if (![_document.undoManager canRedo]) self.redoButton.enabled = NO;
}

Реализация отслеживания изменений

Для реализации отслеживания изменений вместо того, чтобы реализовать отмену/восстановление вызовите updateChangeCount: метод на UIDocument объект в надлежащих точках в Вашем коде. Так же, как, когда Вы регистрируете действие отмены, это обычно в точке, где Вы обновляете объект модели документа с данными, пользователь только что вошел. Параметр передал в, должен быть a UIDocumentChangeDone постоянный.

Перечисление 5-2 показывает, как Вы могли бы вызвать updateChangeCount: из a UITextViewDelegate метод, который вызывают, когда изменение внесено в текстовом представлении.

Перечисление 5-2  , Обновляющее количество изменения документа

-(void)textViewDidChange:(UITextView *)textView {
    _document.documentText = textView.text;
    [_document updateChangeCount:UIDocumentChangeDone];
}