как canBecomeFirstResponder предоставить настраиваемый inputAccessoryView

Я пытаюсь сделать пользовательский inputAccessoryView содержащий UITextField и закрепить его снизу, как приложение чата

но если я не использовал canBecomeFirstResponder = true inputAccessoryView скрыты (?)

это мой код

class MainVC: UITableViewController {
  lazy var inputTextFieldContainer: UIView = {
    // custom inputAccessoryView
  }()

  override func viewDidLoad(){
    super.viewDidLoad()
  }

  override var inputAccessoryView: UIView? {
      get{
          return containerView
      }
  }

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

как canBecomeFirstResponder принести кастом inputAccessoryView

я читал о UIResponder и цепочке респондентов в документации Apple

но я не мог сопоставить эту концепцию с этой проблемой.

Они сказали, что UIResponder будет обрабатывать события, и я сделаю свой MainVC первым респондентом к canBecomeFirstResponder = true

и inputAccessoryView показаны

но каково точное событие в данном случае и ситуации


person PrepareFor    schedule 31.03.2018    source источник
comment
Вы злоупотребляете inputAccessoryView для чего-то не предназначенного. У вас не может быть рабочего ввода в inputAccessoryView.   -  person Sulthan    schedule 31.03.2018


Ответы (1)


Поскольку ваш код наследуется от UITableViewController, вот полный пример с ним:

Начните с определения дополнительного вида. Поскольку вы упомянули в качестве примера приложение для чата, это может быть текстовое поле и кнопка отправки:

class SendMessageView: UIView {

    private let textField = UITextField()
    private let sendButton = UIButton()

    init() {
        super.init(frame: CGRect.zero)
        self.setup()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) not implemented")
    }

    private func setup() {
        sendButton.setTitle("Send", for: UIControlState.normal)
        sendButton.setTitleColor(UIColor.blue, for: UIControlState.normal)
        self.addSubview(textField)
        self.addSubview(sendButton)

        self.backgroundColor = UIColor.groupTableViewBackground
        textField.backgroundColor = UIColor.white

        self.autoresizingMask = .flexibleHeight
        textField.translatesAutoresizingMaskIntoConstraints = false
        sendButton.translatesAutoresizingMaskIntoConstraints = false

        textField.topAnchor.constraint(equalTo: self.topAnchor, constant: 8).isActive = true
        textField.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 16).isActive = true

        sendButton.leadingAnchor.constraint(equalTo: textField.trailingAnchor, constant: 8).isActive = true
        sendButton.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16).isActive = true
        sendButton.centerYAnchor.constraint(equalTo: textField.centerYAnchor).isActive = true
    }

    override var intrinsicContentSize: CGSize {
        let contentHeight = self.textField.intrinsicContentSize.height + 16
        return CGSize(width: UIScreen.main.bounds.width, height: contentHeight)
    }
}

Затем вам понадобится настраиваемый UITableView, который использует наше вспомогательное представление:

class CustomTableView: UITableView {

    private let sendMessageView = SendMessageView()

    override var canBecomeFirstResponder: Bool {
        return true
    }

    override var inputAccessoryView: UIView? {
        return self.sendMessageView
    }
}

Наконец, можно определить TableViewController, используя это настраиваемое табличное представление:

class TableViewController: UITableViewController {

    override func loadView() {
        self.tableView = CustomTableView()
        self.view = self.tableView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.becomeFirstResponder()
    }

    ...

Результат будет выглядеть так:

[вид дополнительных устройств ввода [1]

person Stephan Schlecht    schedule 01.04.2018
comment
Большое спасибо! я попытаюсь!! - person PrepareFor; 03.04.2018