当UITextField.secureTextEntry更改其值时,快速获取回调

时间:2018-06-28 17:55:42

标签: swift uitextfield

我正在寻找一种当UITextField的secureTextEntry值更改时获取回调或事件的方法。

我需要这个的原因如下。

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

2 个答案:

答案 0 :(得分:2)

在自定义UITextfield类内部

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")
     }
}

答案 1 :(得分:2)

另一种解决方案。创建一个协议,其中包含将在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)")
        }
    }
}