Управление выборами

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

Выборы в табличных представлениях

Существует несколько инструкций интерфейса пользователя для учета при контакте с выбором ячейки в табличных представлениях:

Можно управлять, можно ли строки выбрать, когда табличное представление находится в режиме редактирования путем установки 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];
}