怎么能成为FirstFirstResponder带来自定义输入访问视图

时间:2018-03-31 10:18:41

标签: ios swift uiresponder becomefirstresponder 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

我在Apple docs上阅读了有关UIResponder和响应者链的信息

但我无法将这个概念与此问题相匹配。

他们说UIResponder会处理这些事件,我通过canBecomeFirstResponder = true

让我的MainVC成为第一响应者 显示

inputAccessoryView

但在这种情况和情况下确切的事件是什么

1 个答案:

答案 0 :(得分: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()
    }

    ...

结果如下:

[input accessory view[1]