У меня есть UIScrollView, в который я помещаю некоторые текстовые поля и tableView.
Это не проблема делегата таблицы. Я могу получить didSelectRowAt, если щелкнуть и перетащить строку. Просто простое нажатие строки не проходит.
Я не показываю реализацию таблицы ниже, потому что она обычно работает, и я думаю, что именно бит жеста вызывает проблему.
Я добавил распознаватель жестов в UIScrollView, так что если вы нажмете на фон просмотра, вы закончите редактирование текущего поля. Это работает, чтобы отклонить редактирование и клавиатуру, но для UITableView я не получаю didSelectRowAt, когда я нажимаю на строку. Я должен нажать на строку и перетащить горизонтально, чтобы получить вызов метода didSelectRowAt. * 1009 *
Есть ли способ перенаправить жест касания в UITableView? Или это просто плохая идея использовать распознаватель жестов в UIScrollView, если у меня есть таблица в этом представлении? Кнопка в том же виде будет получать нажатие и обрабатывать событие кнопки. Не уверен, почему стол не получит ответ. Таблица также будет правильно прокручиваться, но не видит касание строки.
Основные методы класса UIView
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(white: 1, alpha: 1.0) // was .97
// Container
setupScrollView()
registerKeyboardNotifications()
addGestureRecognizer()
}
func setupScrollView() {
view.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
scrollView.contentSize = CGSize(width: view.frame.width, height: 1000)
scrollView.autoresizingMask = UIViewAutoresizing.flexibleBottomMargin
scrollView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
scrollView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true
scrollView.heightAnchor.constraint(equalTo: view.heightAnchor, constant: 0).isActive = true
}
func addGestureRecognizer() {
// When tap on the container -- end editing on current field
let tapRecognizer = UITapGestureRecognizer(target: self,action: #selector(tapDidTouch(sender: )))
self.scrollView.addGestureRecognizer(tapRecognizer)
}
@objc func tapDidTouch(sender: Any) { // this method eats UITableView clicks
self.view.endEditing(true)
}
Расширение для работы с клавиатурой
extension TestView {
func registerKeyboardNotifications() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self,selector: #selector(keyboardWillShow(notif:)),name: .UIKeyboardWillShow,object: nil)
notificationCenter.addObserver( self, selector: #selector(keyboardWillHide(notif:)),name: .UIKeyboardWillHide,object: nil)
notificationCenter.addObserver(self, selector: #selector(keyboardWillShow(notif:)), name: .UIKeyboardWillChangeFrame, object: nil)
}
@objc func keyboardWillShow(notif: Notification) {
guard let frame = notif.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect else { return}
scrollView.contentInset = UIEdgeInsets(top: 0.0,
left: 0.0,
bottom: frame.height,
right: 0.0)
}
@objc func keyboardWillHide(notif: Notification) {
scrollView.contentInset = UIEdgeInsets()
}
}