首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >canBecomeFirstResponder如何自定义inputAccessoryView

canBecomeFirstResponder如何自定义inputAccessoryView
EN

Stack Overflow用户
提问于 2018-03-31 10:18:41
回答 1查看 1.9K关注 0票数 0

我正在尝试使自定义inputAccessoryView包含UITextField,并像聊天应用程序一样将其停靠在底部

但是如果我不使用canBecomeFirstResponder = trueinputAccessoryView是隐藏的(?)

这是我的密码

代码语言:javascript
复制
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和回应者链

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

他们说UIResponder将处理这些事件,我让我的MainVC成为canBecomeFirstResponder = true的第一个响应者

inputAccessoryView显示

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-01 20:52:14

由于您的代码在这里继承自UITableViewController,因此有一个完整的示例:

从定义附件视图开始。由于您提到了一个聊天应用程序,它可以是一个文本字段和一个发送按钮:

代码语言:javascript
复制
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:

代码语言:javascript
复制
class CustomTableView: UITableView {

    private let sendMessageView = SendMessageView()

    override var canBecomeFirstResponder: Bool {
        return true
    }

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

最后,可以使用这个自定义表视图定义一个TableViewController:

代码语言:javascript
复制
class TableViewController: UITableViewController {

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

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

    ...

结果如下所示:

[

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49586673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档