Подтвердить что ты не робот

UITableView didSelectRowAtIndexPath вызывается дважды

При определенных обстоятельствах 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. Кроме того, PushedViewController используется повторно, чтобы не перезагружать его каждый раз, когда ячейка выбрана в UITableView.

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

4b9b3361

Ответ 1

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

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

    ... do other stuff

    }

Ответ 2

Отключить взаимодействие пользователя после первого "didSelectRow". Возможно, что во время перехода несколько кранов будут "складываться".

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

Ответ 3

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

Ответ 4

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

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

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

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