不在 UITextField 自定义子类中调用的委托方法

Delegate methods not calling in UITextField custom subclass

我正在从 UITextField class 创建自定义子 class。我想在文本字段聚焦时应用一些东西。但是在我的自定义 class 中,我的委托方法没有调用。

我创建了一个扩展 UITextField class 的子class 并进行了一些自定义。

在 TGTextField 中 class:

class TGTextField: UITextField, UITextFieldDelegate {

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    delegate = self
    createBorder()
}
required override init(frame: CGRect) {
    super.init(frame: frame)
    delegate = self
    createBorder()
}
func createBorder(){
    self.layer.borderColor = AppColor.TextFieldColors.BorderNormalColor.cgColor
    self.layer.borderWidth = 1.0;
    self.layer.cornerRadius = 8
}

func textFieldDidBeginEditing(textField: UITextField) {
    print("focused")
    self.activeTextFieldColor()
}
func textFieldDidEndEditing(textField: UITextField) {
    print("lost focus")
     self.deactiveTextFieldColor()
}

func activeTextFieldColor(){
    self.layer.borderColor = AppColor.TextFieldColors.BorderActiveColor.cgColor
}
func deactiveTextFieldColor(){
    self.layer.borderColor = AppColor.TextFieldColors.BorderNormalColor.cgColor
}
}

这两个委托方法都没有被调用。

func textFieldDidBeginEditing(textField: UITextField) {
    print("focused")
    self.activeTextFieldColor()
}
func textFieldDidEndEditing(textField: UITextField) {
    print("lost focus")
     self.deactiveTextFieldColor()
}

看起来您正在实施错误的方法签名;你应该把 _ 放在 textField 之前,像这样

func textFieldDidBeginEditing(_ textField: UITextField) {}
func textFieldDidEndEditing(_ textField: UITextField) {}

Xcode 应该可以帮助您突出显示警告

Instance method 'textFieldDidBeginEditing(textField:)' nearly matches optional requirement 'textFieldDidBeginEditing' of protocol 'UITextFieldDelegate'

你的代码适合我。如果在初始化文本字段后将文本字段委托设置为相应的视图控制器,则不会调用自定义 class 中的这些委托方法。

为了避免在 TGTextField 而不是 UITextFieldDelegate

中添加目标
class TGTextField: UITextField {

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        //delegate = self
        createBorder()
    }
    required override init(frame: CGRect) {
        super.init(frame: frame)
        //delegate = self
        createBorder()
    }
    func createBorder(){
        self.layer.borderColor = UIColor.red.cgColor
        self.layer.borderWidth = 1.0;
        self.layer.cornerRadius = 8
        addTarget(self, action: #selector(activeTextFieldColor), for: .editingDidBegin)
        addTarget(self, action: #selector(deactiveTextFieldColor), for: .editingDidEnd)
    }
    @objc func activeTextFieldColor(){
        self.layer.borderColor = UIColor.green.cgColor
    }
    @objc func deactiveTextFieldColor(){
        self.layer.borderColor = UIColor.red.cgColor
    }
}