Нажатие на выбранную строку не приводит к ее отмене. Когда ячейка выделяется, она остается выделенной до тех пор, пока deselectRowAtIndexPath: animated: не будет вызван в ее таблице. Вот почему ваш метод не вызывается для второго касания.
В архитектуре MVC, такой как UIKit, рекомендуется обрабатывать взаимодействия с пользователем в классах контроллера. Было бы целесообразно переопределить - [UITableViewCell setSelected: animated:], если все, что вы делали, это настраивали способ представления представления для выбранной ячейки, но в этом случае ваше поведение переключателя расширения / сжатия потребовало бы изменения в способе выбора UITableView и снимает выделение с его ячеек.
Вы можете создать подкласс UITableView и реализовать это переключающее поведение самостоятельно, или вы можете оставить UITableView в покое и обработать все это на уровне UIViewController, выполнив что-то вроде этого:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.expandedIndexPath isEqual:indexPath]) {
[(YourCustomCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath] contractRow];
self.expandedIndexPath = nil;
}
else {
if (self.expandedIndexPath) {
[(YourCustomCell *)[self tableView:tableView cellForRowAtIndexPath:self.expandedIndexPath] contractRow];
}
[(YourCustomCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath] expandRow];
self.expandedIndexPath = indexPath;
}
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}