Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField

Posted

技术标签:

【中文标题】Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField【英文标题】:Swift How to disable a TextField while another UITextField is highlighted or has value 【发布时间】: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 中的代码我都试过了,结果是一样的。

我怎样才能让它工作?

【问题讨论】:

【参考方案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)

以上是关于Swift 如何在另一个 UITextField 突出显示或具有值时禁用 TextField的主要内容,如果未能解决你的问题,请参考以下文章

如果添加了新的 UITextField,如何向下移动许多 UITextField

如何在 Swift 中自动移动到下一个 UITextField

Swift:点击 UITextField 时如何显示 UIPickerView

如何在 Swift 中将 UITextField 文本居中

Swift:如何使用 UISwitch 控制 UITextField 通过委托启用或禁用

如何在 Swift 中创建 UITextField 对象数组?