Я пытаюсь сделать две вещи одновременно:
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, чтобы те функции активации, деактивации работали на моей заметке, но они не работают. Я думаю, это потому, что он не знает, в какую ячейку заметки переключать метку счетчика и для изменения цвета текста ... но я понятия не имею, как передать эту информацию. Есть идеи? Большое вам спасибо!