Я использую UITableView, чтобы разрешить выбор одного (из многих) элементов. Подобно пользовательскому интерфейсу при выборе мелодии звонка, я хочу, чтобы выбранный элемент был проверен, а остальные нет. Я хотел бы, чтобы при касании ячейка была выделена, а затем анимирована обратно к обычному цвету (опять же, как в интерфейсе выбора мелодии звонка).
Подкласс UIViewController - это делегат и источник данных моей таблицы (не UITableViewController, потому что там у меня также есть панель инструментов).
Я устанавливаю accessoryType ячеек в cellForRowAtIndexPath: и обновляю свою модель, когда ячейки выбраны в didSelectRowAtIndexPath :. Единственный способ установить галочку в выбранной ячейке (и очистить предыдущую) - это вызвать [tableView reloadData] в didSelectRowAtIndexPath :. Однако, когда я делаю это, анимация отмены выбора ячейки становится странной (появляется белая рамка там, где должна быть метка ячейки). Конечно, если я не вызову reloadData, accessoryType не изменится, поэтому галочки не появятся.
Полагаю, я мог бы отключить анимацию, но это выглядит неубедительно. Я также поиграл с получением и изменением ячеек в didSelectRowAtIndexPath :, но это большая боль.
Есть идеи? Сокращенный код следует ...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* aCell = [tableView dequeueReusableCellWithIdentifier:kImageCell];
if( aCell == nil ) {
aCell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:kImageCell];
}
aCell.text = [imageNames objectAtIndex:[indexPath row]];
if( [indexPath row] == selectedImage ) {
aCell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
aCell.accessoryType = UITableViewCellAccessoryNone;
}
return aCell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedImage = [indexPath row]
[tableView reloadData];
}