UITableView на UIScrollView - didSelectRowAt не вызывается при нажатии (нажатие прерывания распознавателя жестов) - PullRequest
0 голосов
/ 01 мая 2018

У меня есть 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()
      }
  }
...