2014-01-21 2 views
0

У меня есть UITableView с пользовательским подклассом UITableCellView. Я хочу показать одну из строк как активную или выбранную. Элементы управления в моей ячейке имеют свои собственные жесты, но у меня есть область справа, где я могу сделать выбор. Я (наивно) думал, что могу просто указать, что мне нужен аксессуар стиля галочки, но документы Apple говорятКак сделать (пользовательский) выбор с пользовательским подклассом UITableViewCell

Этот элемент управления не отслеживает касания. Делегат таблицы вида может управлять отметками в секции строк (возможно, ограничивая отметку одной строке раздела) в своем методе tableView: didSelectRowAtIndexPath:.

Я не уверен, как это интерпретировать, но я положил метод tableView:didSelectRowAtIndexPath: в свой делегат, и он никогда не срабатывает. Независимо от того, где я касаюсь моей камеры (со стороны, где есть сенсорные элементы управления или нет). Так что мне любопытно, почему это не работает? Я также заметил, что независимо от того, как я установил свойство selected на ячейки, эта галочка всегда отображается, поэтому я не думаю, что это действительно предназначено для использования индикатора выбора.

Но я на самом деле в порядке с этим. Я действительно не хочу галочку, я предпочел бы сделать что-то вроде почты, когда он будет выбирать несколько с левой стороны, круги стиля с кнопками-переключателями. Что затем приводит меня к затруднительному по поводу того, как действовать. Должен ли я просто добавить элемент управления кнопки в правую сторону, правильно обработать изображения в моем пользовательском подклассе ячейки? В этом случае я использую фоновое изображение кнопки? Или просто изображение? И поскольку для выбора нужно отменить выбор других, как лучше всего это подключить к делегату табличного представления, а не к подклассу? Или я должен создать собственный подкласс NSView?

UPDATE

Я снял аксессуар. Я добавил UIImageView для отображения состояния выбора. Поскольку субконтроллер в моей ячейке использует жест hold, отборное нажатие пропускает его почти всюду для ячейки. Синхронизировать визуальное состояние выбора, используя следующий метод:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
    self.selectionView.image = self.selected ? [UIImage imageNamed: @"selected"] : [UIImage imageNamed: @"not_selected"]; 
} 

На мой пользовательский контроллер, я добавил следующий метод:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [Site setCurrent: self.allSites[indexPath.row]]; 
    [[Site current] pullValves]; 
} 

Это, наконец, надел на меня, что, что первый метод был для обновления визуальное состояние, но не для ответа на намерение пользователей, которое принадлежит второму методу. Первые пожары в разное время, но второй применяется, когда пользователь на самом деле делает кран.

Наконец, я должен был программно установить

self.clearsSelectionOnViewWillAppear= NO; 

Не имеет значения, что я поставил в раскадровке, что значение было YES, поэтому возвращение к списку очищал мой выбор.

ответ

1

Вы добавляете жест каждой из создаваемых вами ячеек? Я вернул бы это оттуда и создаю жест на главном контроллере, который держит ваше табличное представление (а не отдельные ячейки).

Добавьте это на свой главный контроллер, чтобы контроллер мог обрабатывать жесты соответствующим образом.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 

Если вам необходимо отслеживать ячейку, которая была затронута (скажем, для панорамирование жест), вы можете получить индекс путь данный жест распознаватель.

CGPoint p = [recognizer locationInView:self.tableView]; 
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 

Оттуда мы возвращаемся к вашей цели: отслеживаем вашу активную ячейку. tableView: didSelectRowAtIndexPath нуждается в ударе (надеюсь, шаги, описанные выше, здесь). Сохраните определенный идентификатор элемента, который необходимо сохранить. Когда tableView: willDisplayCell: forRowAtIndexPath вызывается, вы можете вызвать состояние выбора.

+0

Я не уверен, как вы отвечаете на мой вопрос. Я думаю, вы думаете, что я делаю это плохая идея (tm). Который я довольно новичок в этом, признаю, вполне может быть. Но я должен понять, почему ... –

Смежные вопросы