Отслеживание изменений и операции отмены
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]; |
} |