scrollToRow не прокручивается на tableViewCell с TextView - Swift 4 - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть tableView с 4 разделами (этот tableView находится внутри View, я сделал его как всплывающее представление), и у каждого раздела есть разные строки.

В последнем разделе (4),У меня есть TextView, и когда TextView начинает редактироваться, мне нужно прокрутить tableView, потому что клавиатура покрывает TextView.

Я попытался scrollToRow в textViewDidBeginEditing, потому что именно здесь я хочу запустить прокрутку:

func textViewDidBeginEditing(_ textView: UITextView) {
    let numberOfSections = tableView.numberOfSections
    let numberOfRows = tableView.numberOfRows(inSection: numberOfSections-1)
    let indexPathToScroll = NSIndexPath(row: numberOfRows-1, section: numberOfSections-1)
    self.tableView.scrollToRow(at: indexPathToScroll as IndexPath, at: .middle, animated: false)
}

numberOfSections равно 4, numberOfRows равно 1, потому что у меня есть 1 строка в разделе 4, поэтому из-за этого я вычитаю 1 из numberOfRows и numberOfSections для создания indexPathToScroll, потому что последняя строка равна [0,3] а не [1,4].

Я пробовал scrollToRow по центру / верху / низу, и я пытался анимировать true или false, ничего не произошло, прокрутка не работает.

Anyидея почему не работает?Может быть, я не могу сделать это в textViewDidBeginEditing?

Спасибо!


Решено с помощью Центра уведомлений:

   override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    }

А потом:

    @objc func keyboardWillShow(notification: Notification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0{
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }

    @objc func keyboardWillHide(notification: Notification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y != 0 {
                self.view.frame.origin.y += keyboardSize.height
            }
        }
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if(text == "\n") {
            textView.resignFirstResponder()
            return false
        }
        return true
    }
...