UITableViewCell setSelected:animated, извикан два пъти на 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 няма нищо лошо в този код и затова си представям, че има нещо общо със Storyboard.   -  person max_    schedule 09.01.2014
comment
Копирах точния сценарий от iPhone. Файлово копиране и поставяне. Той (изглед на таблица или клетка за изглед на таблица) просто се държи по различен начин на iPhone и iPad, дори с абсолютно същата версия на iOS (използвам симулатор)   -  person Can Poyrazoğlu    schedule 09.01.2014
comment
Как сте настроили делегата? От Storyboard ли е? Може би опитайте да го премахнете и да го добавите отново, за да видите какво ще се случи.   -  person ryanwils    schedule 09.01.2014
comment
Всъщност е лоша практика да се извършва такъв вид действие и в клетка за изглед на таблица. Вместо това трябва да използвате делегата на 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 запис от setSelected:YES animated: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