Как разделить методы делегата между UITableView и UITextView в пользовательской ячейке - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь сделать две вещи одновременно: 1) прокрутить TableView пользовательских ячеек в лучшую позицию, если ячейка с UITextView покрыта им при появлении, и 2) вызывать определенные функции, используя IBOutlets, когда ячейка становится активной, и сохранять ее текст, когда она деактивируется.

Я уже пытался вызывать методы делегата в обоих файлах, один для пользовательской ячейки из контроллера TableView, а другой для контроллера TableView из пользовательской ячейки. Я также пытался сделать контроллер TableView классом ячейки, но XCode не позволяет этого. Я также пытался активировать функции клавиатуры из класса ячеек, но пока не понял, как это сделать.

extension NoteCell: NoteBackDelegate {  
func activateCell() {
    counterLabel.isHidden = false
    let textRemaining = String(240-(textView.text.count))
    counterLabel.text = textRemaining
    textView.textColor = UIColor.darkGray
}
func updateCell() {
    updateDateUpdated = true

    let textRemaining = String(240-(textView.text.count))
    counterLabel.text = textRemaining

    let size = textView.bounds.size
    let newSize = textView.sizeThatFits(CGSize(width: size.width, height: CGFloat.greatestFiniteMagnitude))
    if size.height != newSize.height {
        UIView.setAnimationsEnabled(true) 
        tableView?.beginUpdates()
        tableView?.endUpdates()
        UIView.setAnimationsEnabled(true)
        if let thisIndexPath = tableView?.indexPath(for: self) {
            tableView?.scrollToRow(at: thisIndexPath, at: .bottom, animated: false)
        }
    }
}
func deactivateCell() {
    textView.textColor = UIColor.lightGray
    counterLabel.isHidden = true
}
}

extension TableViewController {
func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
func deregisterFromKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
@objc func keyboardWillShow(notification: NSNotification) {
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize!.height, right: 0.0)

    self.tableView.contentInset = contentInsets
    self.tableView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = activeNoteTextView {
        if (!aRect.contains(activeField.frame.origin)){
            self.tableView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}
func textViewDidBeginEditing(_ textView: UITextView) {
    self.noteBackDelegate?.activateCell()
}

func textViewDidChange(_ textView: UITextView) {
    self.noteBackDelegate?.updateCell()
}

func textViewDidEndEditing(_ textView: UITextView) {
    self.noteBackDelegate?.deactivateCell()
}
@objc func keyboardWillHide(notification: NSNotification) {
    self.tableView.contentInset = UIEdgeInsets.zero
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize!.height, right: 0.0)
    self.tableView.contentInset = contentInsets
    self.tableView.scrollIndicatorInsets = contentInsets
}
}

Еще одна вещь, о которой я расскажу в классе NoteCell, заключается в том, что ячейка должна автоматически переформатироваться так, чтобы она была выше при вводе текста в нее. Опять же, все эти вещи работают сами по себе ... но добавление в нее клавиатуры с автоматической прокруткой вынуждает меня переключить делегат TextView обратно в табличное представление, что, по-видимому, отключает функциональность в моей ячейке заметки.

Я бы надеялся, что, поскольку я вызываю NoteBackDelegate, чтобы те функции активации, деактивации работали на моей заметке, но они не работают. Я думаю, это потому, что он не знает, в какую ячейку заметки переключать метку счетчика и для изменения цвета текста ... но я понятия не имею, как передать эту информацию. Есть идеи? Большое вам спасибо!

...