Swift 在 UITextField.secureTextEntry 改变它的值时得到回调

Swift get callback when UITextField.secureTextEntry changes it`s value

我正在寻找一种方法来在其中一个 UITextFields secureTextEntry 更改值时获得回调或事件。

我需要这个的原因如下。

我扩展了 UITextField 使其具有通过 UITextField 内的按钮打开和关闭 secureTextEntry 的功能。在我的一个视图中,我有两个 UITextField,我希望控制第一个 UITextField 上的 secureTextEntry 状态的按钮也更改另一个 UITextField 上的 secureTextEntry。我认为最好的方法是在视图控件本身中获取回调并切换另一个 UITextField 但我找不到获取 UITextField.secureTextEntry 更改回调的方法。

自定义里面UITextfieldclass

override var isSecureTextEntry:Bool {
    didSet {
        // do next
    }
}

//

let myTextF = UITextField()
var myObserve:NSKeyValueObservation? 

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from  
     myObserve = myTextF.observe(\.isSecureTextEntry) { [weak self] (textF , change) in
       print("changed")
     }
}

另一种解决方案。创建一个协议,其中包含将在 isSecureTextEntry 更改时用作回调的函数。当函数被触发时让你的 ViewController 符合该协议检查哪个文本字段并对其他文本字段做你想做的事情

示例代码

CustomTextField.swift

import UIKit
protocol SecureEntryToggleDelagte {
    func didChangedSecureTextEntry(of textField: CustomTextField, isSecure: Bool)
}
class CustomTextField: UITextField {

    override var isSecureTextEntry: Bool{
        didSet{
            secureEntryDelegate?.didChangedSecureTextEntry(of: self, isSecure: isSecureTextEntry)
        }
    }
    var secureEntryDelegate: SecureEntryToggleDelagte?
}

ViewController

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var textFieldOne: CustomTextField!
    @IBOutlet weak var textFieldTwo: CustomTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textFieldOne.secureEntryDelegate = self
        textFieldTwo.secureEntryDelegate = self
    }

    @IBAction func toggleTextFieldOne(_ sender: Any){
        textFieldOne.isSecureTextEntry = !textFieldOne.isSecureTextEntry
    }
    @IBAction func toggleTextFieldTwo(_ sender: Any){
        textFieldTwo.isSecureTextEntry = !textFieldTwo.isSecureTextEntry
    }

}
extension ViewController: SecureEntryToggleDelagte{
    func didChangedSecureTextEntry(of textField: CustomTextField, isSecure: Bool) {
        if textField == textFieldOne{
            print("textFieldOne isSecureTextEntry \(isSecure)")
        }else if textFieldTwo == textFieldTwo{
            print("textFieldTwo isSecureTextEntry \(isSecure)")
        }
    }
}