繁体   English   中英

如果 UITextField 是子视图,则不会调用 becomeFirstResponder

[英]becomeFirstResponder not called if UITextField is a subview

我对UITextField有一个奇怪的问题:

class AnnotateTextField: UIView {

    // MARK: - Views

    let textField = UITextField()

    // MARK: - Initializers

    init() {
        super.init(frame: .zero)

        setupViews()
    }

    @available(*, unavailable)
    private override init(frame: CGRect) {
        fatalError("init(frame:) has not been implemented")
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // MARK: - Setup

    private func setupViews() {
        let textField = UITextField()
        textField.font = UIFont.systemFont(ofSize: 100.0)
        textField.textColor = .white

        backgroundColor = .black.withAlphaComponent(0.7)
        clipsToBounds = true
        layer.cornerRadius = 16.0
        // Paint stays behind it
        layer.zPosition = 1

        addSubview(textField)
        textField.snp.makeConstraints { make in
            make.edges.equalToSuperview().inset(16.0)
        }
    }

}

如果我将此添加到我的视图并调用becomesFirstResponder键盘将不会显示:

private func addText() {
    let annotateTextField = AnnotateTextField()

    addSubview(annotateTextField)
    annotateTextField.snp.makeConstraints { make in
        make.center.equalToSuperview()
    }

    annotateTextField.textField.becomeFirstResponder()
}

但是对于常规UITextField它工作正常:

private func addText() {
    let text = UITextField()
    addSubview(text)
    // This shows the keyboard
    text.becomeFirstResponder()
}

我在这里做错了什么? 我尝试在AnnotateTextField上启用用户交互,但并没有什么不同。

我认为问题在于setupViews函数。 您正在该函数中创建一个新的文本字段对象,并在此文本字段上进行更改并将其添加到视图中。

要解决此问题,请在函数内删除新的 texfield 对象,例如:

 private func setupViews() {

    textField.font = UIFont.systemFont(ofSize: 100.0)
    textField.textColor = .white

    backgroundColor = .black.withAlphaComponent(0.7)
    clipsToBounds = true
    layer.cornerRadius = 16.0
    // Paint stays behind it
    layer.zPosition = 1

    addSubview(textField)
    textField.snp.makeConstraints { make in
        make.edges.equalToSuperview().inset(16.0)
    }
}

或将类中的文本字段对象与您在此函数中创建的对象相等,例如

 private func setupViews() {
    let textField = UITextField()

    textField.font = UIFont.systemFont(ofSize: 100.0)
    textField.textColor = .white

    backgroundColor = .black.withAlphaComponent(0.7)
    clipsToBounds = true
    layer.cornerRadius = 16.0
    // Paint stays behind it
    layer.zPosition = 1
    self.textField = textField // add this
    addSubview(self.textField) // change this
    textField.snp.makeConstraints { make in
        make.edges.equalToSuperview().inset(16.0)
    }
}

annotateTextField.textField 的框架为零,因为您正在创建一个新的文本字段,并且您正在函数中设置对该文本字段的约束

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM