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.
Кто-нибудь может понять, что может быть причиной этого?
Спасибо.
Ответы
Ответ 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