Используя Отмену на iPhone
UIKit дополняет поведение NSUndoManager
класс путем установления платформы для распределения и выбора менеджеров по отмене в приложении.
Отключение дрожащий как инициирующее событие
По умолчанию пользователи инициировали работу отмены путем сотрясения устройства. Если Вы не хотите это поведение, необходимо сказать приложению не реагировать на события встряски как на запрос редактирования:
application.applicationSupportsShakeToEdit = NO; |
Когда приложение запускает в приложении делегат, Вы обычно устанавливаете это свойство applicationDidFinishLaunching:
или application:didFinishLaunchingWithOptions:
методы.
Отмена и цепочка респондента
Поскольку приложение может иметь один или несколько клиентов отмены — возражает, что регистр и выполняет операции отмены в их локальных контекстах. Каждый из этих объектов имеет свое собственное NSUndoManager
возразите и связанные стеки отмены и стеки повторного выполнения.
Один пример этого сценария включает пользовательские представления, каждый клиент менеджера по отмене. Например, у Вас могло быть окно с двумя пользовательскими представлениями; каждое представление может вывести на экран текст в изменяемых атрибутах (таких как шрифт, цвет и размер), и пользователи могут отменить (или восстановление) каждое изменение в любом атрибуте в любом из представлений. UIResponder
помогает Вам управлять контекстом операций отмены в иерархии представления.
UIResponder
класс объявляет undoManager
свойство через который объекты, которые наследовались от него (в определенных представлениях, и просмотрите контроллеры), может предоставить менеджеру по отмене для платформы. Когда приложение получает событие отмены, UIResponder
восстанавливает работоспособность цепочка респондента (начиная с первого респондента) поиск респондента, возвращающегося NSUndoManager
объект от undoManager
. Найденный первый менеджер по отмене используется для работы восстановления или отмены.
UIKit автоматически создает подходящую предупредительную панель для Вас на основе существования и состояния кормушки отмены. Если пользователь принимает решение выполнить отмену или работу восстановления, менеджер по отмене отправляется undo
или redo
обменивайтесь сообщениями как соответствующие.
Вы обычно предоставляете менеджеру по отмене в контроллере представления (см. Шаблоны разработки).If Вы хотите, чтобы контроллер представления предоставил менеджеру по отмене, контроллер представления должен быть готов стать первым респондентом и должен стать первым респондентом, когда появляется его представление. С другой стороны, когда его представление исчезает, это должно оставить первого респондента. Это делает это путем реализации следующего кода:
- (BOOL)canBecomeFirstResponder { |
return YES; |
} |
- (void)viewDidAppear:(BOOL)animated { |
[super viewDidAppear:animated]; |
[self becomeFirstResponder]; |
} |
- (void)viewWillDisappear:(BOOL)animated { |
[super viewWillDisappear:animated]; |
[self resignFirstResponder]; |
} |
Шаблоны разработки
В приложении для iPhone существует много образцов, соглашений и ограничений, играющих роль при рассмотрении поддержки отмены:
Пользователи взаимодействуют с экранной из информации за один раз.
Пользователи перешли от одного экрана до другого. Каждый экран содержит различный набор информации и управляется контроллером другого представления.
Существуют ясно определенные режимы редактирования, и сохраняющий состояние неявно.
Пользователи часто вводят режим редактирования путем ответвления кнопки Edit. В режиме редактирования им часто дают опцию отменить изменения, которые они внесли. Когда пользователь касается Сделанный, любые изменения, которые они внесли, считаются зафиксированными — пользователь не должен выбирать пункт меню Save, например.
Отмена и сообщения восстановления отправляются непосредственно менеджеру по отмене.
Вам не предоставлены отменой и восстанавливаете методы, которые можно переопределить.
Память на устройствах ограничивается.
Необходимо избежать использовать слишком много памяти, иначе приложение может быть завершено.
При поддержке отмены необходимо учесть эти шаблоны разработки, соглашения и ограничения.
Это не обязательно целесообразно поддерживать отмену глубоко. Ожидание пользователя состоит в том, что, как только меры были приняты, это необратимо. Кроме того, контекст важен. Рассмотрите заявление, выводящее на экран список книг и позволяющее Вам перейти к подробному представлению, поочередно позволяющему Вам редактировать отдельные свойства книги (такие как ее заголовок, автор и дата авторского права). Вы могли бы создать новую книгу из экрана списка, перейти между двумя другими экранами для редактирования его свойств, затем перейти назад к исходному списку. Могло бы казаться странным, если бы работа отмены в представлении списка отменила изменение в имени автора, сделавшемся два экрана далеко вместо того, чтобы удалить всю книгу.
Существует также проблема управления памятью. Каждое действие отмены требует, чтобы данные для выполнения отмены были сохранены в памяти. В некоторых приложениях это может стать значительными издержками. В целом, при попытке свести объем потребляемой памяти, к минимуму лучше. Если Ваши режимы редактирования поддержки приложений, может быть надлежащим создать менеджера по отмене только, когда пользователь вводит режим редактирования, и избавляться от менеджера по отмене, когда пользователь оставляет режим.
Поскольку отмена и сообщения восстановления отправляются непосредственно менеджеру по отмене, необходимо зарегистрироваться как наблюдатель уведомлений изменения менеджера по отмене. В обратных вызовах уведомления можно распространить изменение в пользовательском интерфейсе по мере необходимости.
Поскольку пользователь может перейти между различными экранами во время работы редактирования, Вы, возможно, должны напомнить им, что это, они отменяют. Полезно обеспечить заголовки действия отмены так, чтобы пользователю было ясно, какой эффект отмена или работа восстановления будут иметь.
Следующий пример иллюстрирует, как Вы могли бы реагировать на изменение в редактировании состояния в подклассе UITableView
. Если редактирование начинается, Вы создаете менеджера по отмене для отслеживания изменений. Вы также регистрируетесь как наблюдатель менеджера по отмене уведомления изменения, так, чтобы, если отмена или восстанавливают работу, был выполнен, табличное представление может быть перезагружено. При редактировании концов вычеркните из списка из уведомления, центрируют и удаляют менеджера по отмене.
- (void)setEditing:(BOOL)editing animated:(BOOL)animated { |
[super setEditing:editing animated:animated]; |
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; |
if (editing) { |
NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; |
self.undoManager = anUndoManager; |
[undoManager setLevelsOfUndo:3]; |
[anUndoManager release]; |
[dnc addObserver:self selector:@selector(undoManagerDidUndo:) |
name:NSUndoManagerDidUndoChangeNotification object:undoManager]; |
[dnc addObserver:self selector:@selector(undoManagerDidRedo:) |
name:NSUndoManagerDidRedoChangeNotification object:undoManager]; |
} |
else { |
[dnc removeObserver:self]; |
self.undoManager = nil; |
} |
} |