首页 > 解决方案 > 在 Swift iOS 中使用 UITextField 集合时识别 UITextField

问题描述

我正在创建一个注册屏幕。UITextField有四个,分别是ID、密码、密码校验、姓名,我是@Iboutlet var signupTextFields: [UITextField]!我连接的。之后,我想做一个ID,密码验证。

首先,我划分了 ViewController 和 UItextFieldDelegate。

class SignUpViewController: UIViewController {
    
    @IBOutlet var signUpTextFields: [UITextField]! {
        didSet {
            signUpTextFields.forEach { textField in
                textField.delegate = textFieldDelegate
                textField.returnKeyType = .next
            }
        }
    }
    @IBOutlet weak var nextButton: UIButton!
    
    private lazy var textFieldDelegate = TextFieldDelegate(self)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        signUpTextFields.first?.becomeFirstResponder()
    }
    
    @IBAction func nextButtonTapped(_ sender: UIButton) {
    }
}
class TextFieldDelegate: NSObject, UITextFieldDelegate {
    private weak var signUpViewController: SignUpViewController?
    
    init(_ signUpViewController: SignUpViewController) {
        self.signUpViewController = signUpViewController
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
        textField.layer.borderWidth = 1
        textField.layer.borderColor = UIColor.systemBlue.cgColor
    }

    func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
        textField.layer.borderColor = UIColor.black.cgColor
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

使用Delegate提供的函数时的问题是示例代码是使用if-else来识别UITextField,比如

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField == idTextField {
      //code
    } else if textField == passwordTextField {
      //code
    }
}

我不是这样的,但我想我想将 uitextfield 抽象一点以使用工厂方法或多态性。

有没有办法在不使用 if-Else 的情况下识别 UITextField 集合?

标签: iosswift

解决方案


如果您的意图是在委托方法中表现不同,那么对所有文本字段使用相同的委托是不好的设计。如果改变它为时已晚,我会推荐一个与文本字段数组相对应的闭包数组。这样,调用正确的闭包是基于firstIndex(of:).


推荐阅读