UITableView didSelectRowAtIndexPath вызывается дважды - PullRequest
18 голосов
/ 16 апреля 2011

При определенных обстоятельствах UITableView didSelectRowAtIndexPath вызывается дважды, вызывая ошибку Pushing the same view controller instance more than once is not supported.

Вот последовательность событий:

TableView::didSelectRowAtIndexPath.  
TableView::viewWillDisappear.  
PushedViewController::viewWillAppear.  
TableView::didSelectRowAtIndexPath.  
Error: Pushing the same view controller instance more than once is not supported'  

Единственное, что стоит отметить, это то, что UITableView загружает изображения асинхронно, но это никогда не вызывает didSelectRowAtIndexPath. Кроме того, PressedViewController используется повторно, чтобы избежать необходимости перезагружать его каждый раз, когда ячейка выбирается в UITableView.

Кто-нибудь знает, что может быть причиной этого? Спасибо.

Ответы [ 4 ]

32 голосов
/ 01 июня 2011

Я тоже вижу эту проблему, вероятно, один из 1000 пользователей затронут или меньше. Я ясно вижу, что два didSelectRowAtIndexPath регистрируются 50 мс один за другим. Я предполагаю, что это ошибка в iOS - никакие новые касания не должны быть направлены на старый вид после того, как новый view-контроллер был нажат. Увы, мы можем написать код, защищающий от этого. Вот что я думаю:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
        if (self.navigationController.topViewController != self)        
            return;

    ... do other stuff

    }
1 голос
/ 25 октября 2017

, если вы уже создали Storyboard Segue, не звоните;

[self performSegueWithIdentifier:@"TYPE" sender:self];

в этом методе;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

1 голос
/ 16 апреля 2011

Отключить взаимодействие с пользователем после первого «didSelectRow». Несколько переходов могут «складываться» во время перехода.

Обычно для такого поведения требуется кто-то с удивительной ловкостью в пальцах, но все же.

0 голосов
/ 27 мая 2015

Это происходит из-за segue, который вы используете внутри метода didSelectRowAtIndexPath.Убедитесь, что этот переход создан путем перетаскивания ctrl из кнопки представления в верхней части контроллера представления источника в контроллер представления назначения.Ошибка возникает при создании перехода путем перетаскивания Ctrl из ячейки табличного представления в целевой контроллер представления.Вам не нужно менять любой из ваших кодов.Просто удалите переход и создайте его правильно.Надеюсь, это решит вашу проблему, если я правильно понял вопрос.

...