Управление выборами
Когда пользователи касаются строки табличного представления, обычно что-то происходит в результате. Другое табличное представление могло скользить в место, строка могла вывести на экран галочку, или некоторое другое действие могло быть выполнено. Следующие разделы описывают, как реагировать на выборы и как сделать выборы программно.
Выборы в табличных представлениях
Существует несколько инструкций интерфейса пользователя для учета при контакте с выбором ячейки в табличных представлениях:
Вы никогда не должны использовать выбор для указания состояния. Вместо этого используйте галочки и представления аксессуара для показа состояния.
Когда пользователь выбирает ячейку, необходимо ответить путем отмены выбора ранее выбранной ячейки (путем вызова
deselectRowAtIndexPath:animated:
метод), а также путем выполнения любых соответствующих мер, таких как отображение подробного представления.Если Вы отвечаете на выбор ячейки путем продвижения нового контроллера представления на штабель контроллера навигации, необходимо отменить выбор ячейки (с анимацией), когда контроллер представления выталкивается от штабеля.
Можно управлять, можно ли строки выбрать, когда табличное представление находится в режиме редактирования путем установки allowsSelectionDuringEditing
свойство UITableView
. Кроме того, начиная с iOS 3.0, можно управлять, можно ли ячейки выбрать, когда режим редактирования не в действительности путем установки allowsSelection
свойство.
Ответ на выборы
Пользователи касаются строки в табличном представлении или чтобы сигнализировать к приложению, что они хотят знать больше о том, что та строка показывает или выбрать то, что представляет строка. В ответ на пользователя, касающегося строки, приложение могло сделать любое следующее:
Покажите следующий уровень в иерархии модели данных.
Покажите подробное представление элемента (т.е. вершина иерархии модели данных).
Покажите галочку в строке, чтобы указать, что выбран представленный элемент.
Если бы касание произошло в управлении, встроенном в строку, то оно могло бы реагировать на сообщение действия, отправленное управлением.
Для обработки большинства выборов строк делегат табличного представления должен реализовать tableView:didSelectRowAtIndexPath:
метод. В реализации выборочного метода, показанной в Перечислении 6-1, делегат сначала отменяет выбор выбранной строки. Тогда это выделяет и инициализирует экземпляр следующего контроллера табличного представления в последовательности. Это устанавливает данные, этот контроллер представления должен заполнить свое табличное представление и затем продвигает этот объект на штабель, сохраняемый приложением UINavigationController
объект.
Перечисление 6-1 , Отвечающее на выбор строки
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
[tableView deselectRowAtIndexPath:indexPath animated:NO]; |
BATTrailsViewController *trailsController = [[BATTrailsViewController alloc] initWithStyle:UITableViewStylePlain]; |
trailsController.selectedRegion = [regions objectAtIndex:indexPath.row]; |
[[self navigationController] pushViewController:trailsController animated:YES]; |
} |
Если строка имеет контроль раскрытием — белую двойную угловую скобку по синему кругу — для вспомогательного представление, щелкая по результатам управления в делегате, получающем a tableView:accessoryButtonTappedForRowWithIndexPath:
сообщение (вместо tableView:didSelectRowAtIndexPath:
). Делегат реагирует на это сообщение тем же общим способом, как это делает для других видов выборов.
Строка может также иметь объект управления как вспомогательный представление, такое как переключатель или ползунок. Этот объект управления функционирует, как он был бы в любом другом контексте: Управление объектом надлежащим способом приводит к сообщению действия, отправляемому в целевой объект. Перечисление 6-2 иллюстрирует объект источника данных, добавляющий a UISwitch
возразите, поскольку аксессуар ячейки просматривает, и затем реагирует на сообщения действия, отправленные, когда «зеркально отражается» переключатель.
Перечисление 6-2 , Устанавливающее переключатель, возражает как вспомогательное представление и отвечающий на его сообщение действия
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"CellWithSwitch"]; |
if (cell == nil) { |
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellWithSwitch"]; |
cell.selectionStyle = UITableViewCellSelectionStyleNone; |
cell.textLabel.font = [UIFont systemFontOfSize:14]; |
} |
UISwitch *switchObj = [[UISwitch alloc] initWithFrame:CGRectMake(1.0, 1.0, 20.0, 20.0)]; |
switchObj.on = YES; |
[switchObj addTarget:self action:@selector(toggleSoundEffects:) forControlEvents:(UIControlEventValueChanged | UIControlEventTouchDragInside)]; |
cell.accessoryView = switchObj; |
cell.textLabel.text = @"Sound Effects"; |
return cell; |
} |
- (void)toggleSoundEffects:(id)sender { |
[self.soundEffectsOn = [(UISwitch *)sender isOn]; |
[self reset]; |
} |
Можно также определить средства управления как вспомогательные представления ячеек табличного представления, создаваемых в Интерфейсном Разработчике. Перетащите объект управления (переключатель, ползунок, и т.д.) в окно документа пера, содержащее ячейку табличного представления. Затем с помощью окна соединения сделайте управление вспомогательным представление ячейки. Загрузка Ячеек Табличного представления от Раскадровки описывает процедуру для создания и конфигурирования объектов ячейки табличного представления в файлах пера.
Управление выбором также важно со списками выбора. Существует два вида списков выбора:
Монопольные списки, где только одной строке разрешают галочку
Содержащие списки, где больше чем одна строка может иметь галочку
Перечисление 6-3 иллюстрирует один подход к управлению монопольным списком выбора. Если та же строка выбрана, это сначала отменяет выбор в настоящее время выбираемой строки и возвращается; иначе это устанавливает тип аксессуара галочки на недавно выбранной строке и удаляет галочку на ранее выбранной строке
Перечисление 6-3 , Управляющее списком выбора — монопольный список
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
[tableView deselectRowAtIndexPath:indexPath animated:NO]; |
NSInteger catIndex = [taskCategories indexOfObject:self.currentCategory]; |
if (catIndex == indexPath.row) { |
return; |
} |
NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:catIndex inSection:0]; |
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath]; |
if (newCell.accessoryType == UITableViewCellAccessoryNone) { |
newCell.accessoryType = UITableViewCellAccessoryCheckmark; |
self.currentCategory = [taskCategories objectAtIndex:indexPath.row]; |
} |
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:oldIndexPath]; |
if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) { |
oldCell.accessoryType = UITableViewCellAccessoryNone; |
} |
} |
Перечисление 6-4 иллюстрирует, как управлять содержащим списком выбора. Как комментарии в этом примере указывают, когда делегат добавляет галочку к строке или удаляет один, он обычно также устанавливает или сбрасывает любой связанный атрибут объекта модели.
Перечисление 6-4 , Управляющее списком выбора — содержащий список
- (void)tableView:(UITableView *)theTableView |
didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath { |
[theTableView deselectRowAtIndexPath:[theTableView indexPathForSelectedRow] animated:NO]; |
UITableViewCell *cell = [theTableView cellForRowAtIndexPath:newIndexPath]; |
if (cell.accessoryType == UITableViewCellAccessoryNone) { |
cell.accessoryType = UITableViewCellAccessoryCheckmark; |
// Reflect selection in data model |
} else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { |
cell.accessoryType = UITableViewCellAccessoryNone; |
// Reflect deselection in data model |
} |
} |
В tableView:didSelectRowAtIndexPath:
необходимо всегда отменять выбор в настоящее время выбираемой строки.
Программно выбор и прокрутка
Иногда выбор строки происходит в самом приложении, а не от касания в табличном представлении. В модели данных могло быть внешне вызванное изменение. Например, пользователь добавляет новое лицо к адресной книге и затем возвращается к списку контактов; приложение хочет прокрутить этот список недавно добавленному лицу. Для ситуаций как они можно использовать UITableView
методы selectRowAtIndexPath:animated:scrollPosition:
и (если строка уже выбрана), scrollToNearestSelectedRowAtScrollPosition:animated:
. Можно также вызвать scrollToRowAtIndexPath:atScrollPosition:animated:
если Вы хотите прокрутить к определенной строке, не выбирая его.
Код в Перечислении 6-5 (несколько причудливо) программно выбирает и прокручивает к строке 20 строк далеко от просто выбранной строки с помощью selectRowAtIndexPath:animated:scrollPosition:
метод.
Перечисление 6-5 , Программно выбирающее строку
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath { |
NSIndexPath *scrollIndexPath; |
if (newIndexPath.row + 20 < [timeZoneNames count]) { |
scrollIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row+20 inSection:newIndexPath.section]; |
} else { |
scrollIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row-20 inSection:newIndexPath.section]; |
} |
[theTableView selectRowAtIndexPath:scrollIndexPath animated:YES |
scrollPosition:UITableViewScrollPositionMiddle]; |
} |