Предотвратите получение UITableView двумя касаниями (вложенная поп-анимация может привести к повреждению панели навигации)

Я использую UITableView в своем приложении, которое, когда tapped будет использовать UINavigationController, чтобы нажать другой контроллер представления в стек контроллера контроллера навигации.

Однако, когда ячейка в представлении таблицы дважды добавлена, tableView:didSelectRowAtIndexPath: вызывается дважды, заставляя контроллер навигации нажимать два из этих новых элементов управления представлением s в стеке и в результате получается следующий вывод консоли:

nested pop animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

Это не очень важная проблема, потому что пользователи вряд ли будут выполнять двойной щелчок на ячейках представления таблицы, однако мне было интересно, есть ли элегантное решение для предотвращения такого рода неправильной навигации? (возможно, проверить контроллер навигации topViewController и затем решить, действительно ли должен выполняться метод push pushViewController:?).

Ответ 1

Вот одно линейное решение

self.tableView.multipleTouchEnabled = NO;

Ответ 2

Просто установите userInteractionEnabled на NO как это

в viewWillAppear

-(void)viewWillAppear:(BOOL)animated
{

  // if you return from another viewController
  [tableView setUserinteractionEnabled:YES];

}

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

  // do your logic here and at the end just set user interaction to NO
  [tableView setUserInteractionEnabled:NO];

}

Это заблокирует все пользовательские взаимодействия с вашим табличным представлением.

Ответ 3

Исправление, которое я нашел для описанной здесь проблемы, - это весь код didSelectRowAtIndexPath в следующей проверке:

    if ([[self navigationController] topViewController] == self) {
        [your existing didSelectRowAtIndexPath code here]
    }

Это проверяет, был ли еще один контроллер представления уже вставлен в верхнюю часть стека контроллера представления (и по-прежнему ожидает появления на экране по какой-либо причине).

Я считаю, что свойство multiTouchEnabled, упомянутое в другом месте, фактически относится к функции multi-touch, которая позволяет iOS регистрировать одновременно несколько сенсорных событий (например, сжимать до зума двумя пальцами на экране одновременно) чем несколько последовательных штрихов.

Ответ 4

Иордания Соренсен модернизирована до быстрой:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    if self.navigationController?.topViewController == self
    {
        self.performSegueWithIdentifier("whatever", sender:self)
    }
    else{
        // uncomment to break in else case print("fasttaper superfluous input was ignored")
    }
}

Ответ 5

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    if self.navigationController?.topViewController == self
    {
        return true
    }
    else{
        return false
    }
}

отключить множественное касание на вашей клетке

Ответ 6

Вы можете установить для exclusiveTouch значение true для каждой ячейки.

Если для этого свойства задано значение true получатель блокирует доставку сенсорных событий другим представлениям в том же окне. Значением по умолчанию этого свойства является false.

Документация