UITextView в пользовательском inputaccessoryView не уходит с первого статуса ответчика

У меня есть приложение чата, которое реализует плавающее поле ввода текста (аналогично приложению "Сообщения iOS") в качестве inputAccessoryView моего ChatViewController (см. Документацию Apple).

class ChatViewController: UIViewController {

    override var inputAccessoryView: UIView? {
       return chatInputView
    }

    override var canBecomeFirstResponder: Bool {
        return true
    }
    ...

Мой ChatViewController имеет дочерний контроллер представления ChatTableViewController, в котором есть ячейки, содержащие UITextField, текстовое содержимое которого можно редактировать. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь UITextField на ячейку UITextField, inputAccessoryView UITextView отказывается оставить статус первого респондента, что препятствует редактированию содержимого в UITableViewCell. Следующее предупреждение регистрируется в консоли:

 First responder warning: '<UITextView: 0x7fc041041c00; 
 frame = ...' rejected resignFirstResponder when being removed from hierarchy

Я попытался вызвать resignFirstResponder и endEditing для UIInputView и UITextView напрямую, но безуспешно. Я не хочу, чтобы ChatViewController от статуса первого респондента, так как это привело бы к исчезновению inputAccessoryView.

Редактировать: я также получаю предупреждение при удалении клавиатуры в интерактивном режиме (вместо нажатия на UITableViewCell UITextField.

Ответ 1

Не могли бы вы проверить следующее:

Если UITextView удаляется из супер-представления:

  • Удаляется ли UITextView из иерархии представления?
  • Если бы вы могли resignFirstResponder удалить его из супер-представления.

Если используется подкласс UITextView:

  • Используете ли вы подкласс UITextView, если вы внедрили canResignFirstResponder для возврата false.
  • Не могли бы вы попробовать вернуться true.

Ответ 2

Мое решение:

  1. переопределить canBecomeFirstResponder для вашего inputAccessoryView и этого UITextField для inputAccessoryView
  2. когда пользователь нажимает скрыть клавиатуру или вернуться, установите для canBecomeFirstResponder значение false
  3. удалить inputAccessoryView из его суперпредставления

по-прежнему есть предупреждение при нажатии скрыть клавиатуру, но у меня хорошо работает.