Ячейка представления таблицы Swift 3.0, выбранная длительным нажатием

У меня есть распознаватель жестов, который отклоняет мою клавиатуру, но это мешает tableView didSelectAtRow, потому что tableView не распознает касание, если это не долгое нажатие. Когда я запускаю это в симуляторе и слегка касаюсь tableViewCell, он регистрируется как касание, чтобы закрыть клавиатуру, а не как касание tableView. Однако, если я нажму и удержу немного дольше в симуляторе, он закроет клавиатуру и зарегистрируется как didSelectAtRow для tableView. Это похоже на вопрос UITableView щелкнул и ячейка не выбрана, но выбрана ячейка с длительным нажатием кнопки, но я не знаю, как использовать Objective-C. Мне было интересно, есть ли у кого-нибудь обходной путь к моей проблеме. Я думал, есть ли способ распознать, что я нажал в tableView, что жестRecognizer будет отменен, но я не уверен, как действовать дальше.

Вот что у меня есть до сих пор:

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar.delegate = self


    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(AddressVC.hideKeyboard))
    tapGesture.cancelsTouchesInView = false
    //searchResultsTableView.addGestureRecognizer(tapGesture)
    self.view.addGestureRecognizer(tapGesture)

}
func hideKeyboard()
    {
    self.view.endEditing(true)
    }

введите здесь описание изображения


comment
Краткое руководство по переводу Obj-C на Swift: [a b:c] становится a.b(c).   -  person BallpointBen    schedule 27.05.2017


Ответы (1)


Ваше одиночное касание фиксируется распознавателем жестов и не перенаправляется в табличное представление. Почему бы не использовать функцию didSelectCell класса UITableViewDelegate для отключения клавиатуры при выборе ячейки?

В противном случае вы можете захотеть реализовать UIGestureRecognizerDelegate и соответствующим образом обработать ситуацию. Поскольку вы, вероятно, не проверяете, началось или закончилось касание распознавателей жестов, ваша функция будет вызываться постоянно, пока вы касаетесь.

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

введите здесь описание изображения

person xxtesaxx    schedule 26.05.2017
comment
Я использую распознаватели жестов, чтобы закрыть клавиатуру, потому что это было единственное, что я мог придумать, чтобы закрыть клавиатуру, когда tableView не был выбран (пользователь коснулся вне tableView, не выбирая ячейку). Я работаю с панелью поиска, поэтому не знаю, как это сделать (хотя я могу изучить этот вариант). Вы упомянули установить требования (отказаться) другого распознавателя, как я могу это сделать? - person Kevin; 27.05.2017
comment
Как насчет кнопки «Готово» на самой клавиатуре? Вы можете потребовать, чтобы один распознаватель жестов срабатывал только в случае сбоя другого. Делая это таким образом, вы можете предотвратить срабатывание распознавателя жестов одним нажатием при срабатывании длительного нажатия. Это все равно не решит вашу проблему, заключающуюся в том, что ячейки больше не доступны для касания. Для этого вам нужно будет реализовать делегата распознавателя жестов, получить жесткую позицию и вручную проверить, находится ли она внутри ячейки таблицы, а затем не позволять распознавателю захватывать прикосновение. возможно, это также способ переадресации касания, но вам нужно проверить документацию. - person xxtesaxx; 27.05.2017
comment
Взгляните на библиотеку IQKeyboardManager. Он довольно хорошо справляется с клавиатурой и дает вам кнопку «Готово» на панели инструментов клавиатуры бесплатно. Также сделайте так, чтобы на клавиатуре отображалась кнопка «Готово» или «Возврат». Так, наверное, удобнее. Другим решением может быть добавление UIView поверх всей таблицы, когда появляется клавиатура, и добавление распознавателя жестов в это представление. затем, как только вы нажали на нее и закрыли клавиатуру, удалите представление. - person xxtesaxx; 27.05.2017
comment
На моей клавиатуре уже есть кнопка поиска. Но я не уверен, что понимаю, как это может помочь. Вы упомянули, что я могу запретить жест одиночного нажатия, чтобы он не срабатывал при длительном нажатии, но когда пользователь выбирает ячейку таблицы касанием, это не сработает, не так ли? Вы также упомянули об использовании UIView поверх tableView и после добавления в представление распознавателя жестов. Это та же проблема, что и нажатие в tableView не выберет ячейку (как только долгое нажатие). Пожалуйста, дайте мне знать, правильно ли я интерпретировал. - person Kevin; 27.05.2017
comment
Я не понимаю, почему вы вообще хотите скрыть клавиатуру в своем контроллере поиска, но я просто сказал, что у вас есть много вариантов. Лично я бы не стал использовать распознаватель жестов в табличном представлении, чтобы отключить клавиатуру. Я бы использовал панель инструментов клавиатуры или кнопку возврата на клавиатуре (вы также можете заставить кнопку поиска скрывать клавиатуру) или использовать didSelectCell, чтобы скрыть клавиатуру. Однако, если вы хотите использовать распознаватель жестов в своем табличном представлении, вы должны обработать касание и перенаправить его в табличное представление. - person xxtesaxx; 27.05.2017
comment
Внедрив UIGestureRecognizerDelegate, вы можете решить захватывать касания только при отображении клавиатуры. Затем, когда вы решите не захватывать прикосновение из-за отсутствия клавиатуры, табличное представление может принять прикосновение. Для меня, однако, это не имеет смысла, потому что это заставляет пользователя касаться дважды. Один раз, чтобы закрыть клавиатуру, и один раз, чтобы нажать на ячейку. - person xxtesaxx; 27.05.2017
comment
Но, как я уже сказал, вы также можете проверить, где произошло касание, получить соответствующую ячейку и перенаправить касание вручную. Возможно, вы захотите прочитать документацию UIGestureRecognizer и UIGestureRecognizerDelegate. Я знаю, что иногда это трудно понять, но прочтение 1-2 раз даст вам много знаний и поможет понять, что на самом деле происходит. :) - person xxtesaxx; 27.05.2017
comment
Я хочу скрыть клавиатуру, когда выбран tableViewCell (я уже поместил код в этот делегат, чтобы отклонить его при выборе), и когда tableView присутствует, но пользователь касается вне tableView, чтобы скрыть tableView и отклонить клавиатуру (выход из поиска). Моя проблема в том, что я не хочу, чтобы жестRecognizer (касание) распознавался в tableView, чтобы избавиться от клавиатуры. Я просто хочу, чтобы пользователь мог выбрать ячейку. - person Kevin; 27.05.2017
comment
Хм, я думаю, я все еще не понимаю вас правильно. Если вы хотите фиксировать прикосновения ВНЕ таблицы, зачем вы добавляете распознаватель жестов В таблицу? Что вы имеете в виду, когда tableView присутствует, но пользователь касается вне tableview? разве таблица не покрывает весь экран? - person xxtesaxx; 27.05.2017
comment
Ах нет, поэтому мой вид раскадровки состоит из панели вверху и tableView, покрывающих, возможно, четверть представления. Поэтому, когда панель нажата, отображается tableView, и пользователь может нажать за пределами tableView (некоторое другое пространство), чтобы отменить поиск и скрыть tableView. Я добавляю распознаватель жестов в представление (весь экран), но я не хочу, чтобы он применялся к tableView. Извините за путаницу! - person Kevin; 27.05.2017
comment
Ах хорошо. Похоже, что представление покрывает ваше табличное представление, и поэтому распознаватель жестов получает прикосновение. Пожалуйста, попробуйте переместить представление, которое покрывает экран, ниже вашего табличного представления. В раскадровке это означает, что табличное представление должно быть ниже в списке и НЕ ДОЛЖНО быть дочерним элементом представления. иерархия может быть: уровень 1-> представление контроллера, уровень 2-> представление, охватывающее весь экран, также уровень 2, но в похоти под представлением-> табличное представление - person xxtesaxx; 27.05.2017
comment
Хорошо, я думаю, мы можем что-то найти. Я отредактировал свой вопрос с изображением того, что вы рекомендовали. Правильно ли я сделал? Потому что когда я загружаю ВК, он черный. - person Kevin; 27.05.2017
comment
Это не то, что я имел ввиду. Я сам добавил скриншот. Проверьте это - person xxtesaxx; 27.05.2017
comment
А, понятно, как мне добавить View с помощью UIGestureRecognizer или чего-то подобного? - person Kevin; 27.05.2017
comment
Я только что переименовал простой UIView. Это не особый вид. - person xxtesaxx; 27.05.2017
comment
Хорошо, я добавил UIView из библиотеки объектов и покрыл весь VC (раньше у меня не было представления). И после размещения tableView в иерархии представлений все равно не повезло. - person Kevin; 27.05.2017
comment
Хм, может быть, вы можете создать демо-версию кода или опубликовать свой проект где-нибудь, иначе трудно сказать, что может вызвать побочные эффекты. - person xxtesaxx; 27.05.2017
comment
Я думаю, что происходит то, что когда я ссылаюсь на self.view.addGestureRecognizer(tapGesture), он думает, что я говорю обо всем представлении (родительском), а не о UIView, который я перетащил (дочернем). Как я могу отличить их в коде? - person Kevin; 27.05.2017
comment
Вы должны создать @IBOutlet для представления и назвать его иначе, чем просто представление, потому что каждый UIViewController уже имеет свойство с именем представление. Затем вызовите myCustomView.addGesture... - person xxtesaxx; 27.05.2017
comment
Рад, что смог помочь :) - person xxtesaxx; 27.05.2017