簡體   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