UITableViewCell setSelected: анимированный вызов дважды на iPad

У меня есть пользовательский UITableViewCell в моем приложении для iPhone, для которого у меня есть пользовательский метод setSelected:animated. Мое приложение отлично работает на iPhone, однако я начал портировать свое приложение на iPad. Я скопировал точно такую ​​же раскадровку, ничего не менял, но теперь мой метод setSelected:animated вызывается дважды (с теми же параметрами), когда я выбираю свою ячейку. Я мог бы «обработать» этот случай, проверив, есть ли iPad и т. Д., Но это было бы плохой практикой. Что может быть причиной того, что он вызывается один раз на iPhone и дважды на iPad? (оба iOS 7.0.3) Свойства табличного представления точно такие же (я скопировал файл раскадровки iPhone).

Вот соответствующий код:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    isSelected = selected;
    [self setNeedsDisplay];
    if(selected){
        SocialMatchAppDelegate *del = (SocialMatchAppDelegate*)[UIApplication sharedApplication].delegate;
        del.selectedUser = self.user;
        [del.resultViewController performSegueWithIdentifier:@"viewProfile" sender:self];
    }
}

person Can Poyrazoğlu    schedule 08.01.2014    source источник
comment
Вы можете опубликовать свой код для анализа?   -  person ldindu    schedule 08.01.2014
comment
Я добавил код setSelected:animated   -  person Can Poyrazoğlu    schedule 09.01.2014
comment
@canpoyrazoğlu в этом коде нет ничего плохого, и поэтому я предполагаю, что это как-то связано с раскадровкой.   -  person max_    schedule 09.01.2014
comment
Я скопировал точную раскадровку с iPhone. Файловая копия-вставка. Он (представление таблицы или ячейка представления таблицы) просто ведет себя по-разному на iPhone и iPad, даже с одной и той же версией iOS (я использую симулятор)   -  person Can Poyrazoğlu    schedule 09.01.2014
comment
Как у вас настроен делегат? Это из раскадровки? Может быть, попробуйте удалить его и добавить снова, чтобы посмотреть, что произойдет.   -  person ryanwils    schedule 09.01.2014
comment
На самом деле это плохая практика выполнять такие действия и внутри tableviewcell. Вместо этого вы должны использовать делегат tableview: tableView:didSelectRowAtIndexPath: это правильное место для размещения такой логики.   -  person Quxflux    schedule 13.01.2014
comment
@Lukas да, было бы неплохо применить логику к этому методу в качестве практики, но все же я хочу решить, что setSelected:animated вызывается дважды, так как это может создать путаницу в будущем, а setNeedsDisplay может стать дорогостоящим в вычислительном отношении для больших Просмотры. не очень важно, но зачем называть это дважды?   -  person Can Poyrazoğlu    schedule 14.01.2014
comment
У меня точно такая же проблема с аналогичным кодом, выполненным в Swift. У меня также есть универсальная версия раскадровки, поэтому одна и та же раскадровка для iPhone и iPad. Я также обнаружил, что setSelected вызывается дважды на iPad — если я меняю симулятор на iPhone (любой из них). Проблема не существует. .. Как лучше всего избежать двойного выбора?   -  person jake1981    schedule 27.11.2014


Ответы (2)


Я полагаю, что это нормальное поведение, если вы используете iPad.

Чтобы перестать получать несколько «setSelected: YES» или несколько «setSelected: NO», все, что вам нужно сделать, это это:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Теперь 1 щелчок по любой ячейке дает вам:

  • 1 запись setSelected:YES анимированная:NO
  • 1 запись tableView: didSelectRowAtIndexPath:
  • 1 запись setSelected: НЕТ анимация: ДА
person OlDor    schedule 05.08.2015
comment
почему это нормальное поведение? - person Zaporozhchenko Oleksandr; 24.03.2018

Куда - (void)setSelected:(BOOL)selected звонил в вашем источнике?

If it is in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

Используя это вместо

[tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];

person Wanbok Choi    schedule 12.11.2014
comment
Я не звонил. Я просто выбрал его, прикоснувшись к нему :) - person Can Poyrazoğlu; 12.11.2014