【问题标题】:Swift How to disable a TextField while another UITextField is highlighted or has valueSwift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField
【发布时间】:2020-10-11 21:03:50
【问题描述】:

我有三个文本字段:tempTextField、airPressureTextField 和 airDensityTextField。我想在 Textfields 之间创建一个检查以获得以下逻辑: 如果 tempTextField 或 airPressureTextField 在用户尝试输入值或用户输入值并返回时处于焦点位置,我想禁用 airDensityTextField。我试过这段代码。它正确禁用了 airDensityTextField。但是如果我从 tempTextField 或 airPressureTextField 中移除焦点并清空这两个文本字段,airDensityTextField 仍然被禁用。

func textFieldDidEndEditing(_ textField: UITextField) {
    if let t = tempTextField.text, let ap = airPressureTextField.text {
            airDensityTextField.isEnabled = false
    } else {
            airDensityTextField.isEnabled = true
    }
}

textFieldDidEndEditing 和 textFieldDidBeginEditing 中的代码我都试过了,结果是一样的。

我怎样才能让它工作?

【问题讨论】:

    标签: swift uitextfield


    【解决方案1】:

    您可以在textFieldDidBeginEditing 中查看正在编辑的文本字段并禁用airDensityTextField。然后,当他们完成编辑时,除了是否为 nil 之外,您还需要检查文本是否为 ""(空白)。

    class TextFieldVC: UIViewController, UITextFieldDelegate {
        
        @IBOutlet weak var tempTextField: UITextField!
        @IBOutlet weak var airPressureTextField: UITextField!
        @IBOutlet weak var airDensityTextField: UITextField!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            tempTextField.delegate = self
            airPressureTextField.delegate = self
            airDensityTextField.delegate = self
        }
        
        func textFieldDidBeginEditing(_ textField: UITextField) {
            switch textField {
            case tempTextField:
                airDensityTextField.isEnabled = false
            case airPressureTextField:
                airDensityTextField.isEnabled = false
            default:
                break
            }
        }
        
        func textFieldDidEndEditing(_ textField: UITextField) {
            if
                let tempText = tempTextField.text,
                let apText = airPressureTextField.text,
                tempText != "" || apText != "" /// check if at least one of them has text
            {
                airDensityTextField.isEnabled = false
            } else {
                airDensityTextField.isEnabled = true
            }
        }
        
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            textField.resignFirstResponder()
            return false
        }
    }
    

    【讨论】:

    • 谢谢你的作品。我会接受你的回答。我有一个简单的问题 - 我想通过根据 tempTextField 和 airPressureTextField 提供的值重新计算它的值来更新 airDensityTextField,我应该在 textFieldDidEndEditing 中执行此操作吗?
    • 当然。或者,如果您想实时更新它(当用户输入时),您可以在 textField(_:shouldChangeCharactersIn:replacementString:) 中进行
    • shouldChangeCharactersIn:replacementString里面,你可以得到这样的更新文本:let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多