Ios 委托方法未在UITextField自定义子类中调用

Ios 委托方法未在UITextField自定义子类中调用,ios,swift,uitextfield,uitextfielddelegate,Ios,Swift,Uitextfield,Uitextfielddelegate,我正在从UITextField类创建一个自定义子类。我想在textfield处于焦点时应用一些东西。但是在我的自定义类中,我的委托方法没有调用 我创建了一个子类,它扩展了UITextField类并进行了一些定制 在TGTextField类中: class TGTextField: UITextField, UITextFieldDelegate { required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)!

我正在从UITextField类创建一个自定义子类。我想在textfield处于焦点时应用一些东西。但是在我的自定义类中,我的委托方法没有调用

我创建了一个子类,它扩展了UITextField类并进行了一些定制

在TGTextField类中:

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

看起来您实现了错误的方法签名;您应该将
\uuu
放在
textField
之前,如下所示

func textfielddebeginediting(textField:UITextField){}
func textfielddidediting(textField:UITextField){}

Xcode应该有助于突出显示警告

实例方法“textFieldDidBeginEditing(textField:)”几乎与协议“UITextFieldDelegate”的可选要求“textFieldDidBeginEditing”匹配


看起来您实现了错误的方法签名;您应该将
\uuu
放在
textField
之前,如下所示

func textfielddebeginediting(textField:UITextField){}
func textfielddidediting(textField:UITextField){}

Xcode应该有助于突出显示警告

实例方法“textFieldDidBeginEditing(textField:)”几乎与协议“UITextFieldDelegate”的可选要求“textFieldDidBeginEditing”匹配


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

要避免此问题,请在
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
    }
}

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

要避免此问题,请在
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
    }
}


您不应该在这里实现委托方法。在使用TGTextField的地方实现它。但是有一个通用的行为需要在所有TGTextField上实现。然后你可以添加方法并从实现委托的任何地方调用它们。我认为这不会解决问题。你能用例子解释一下吗?@MuhammadWasim不知道init代码被调用了吗?你不应该在这里实现委托方法。在使用TGTextField的地方实现它。但是有一个通用的行为需要在所有TGTextField上实现。然后你可以添加方法并从实现委托的任何地方调用它们。我认为这不会解决问题。你能举个例子解释一下吗?@MuhammadWasim Does init代码叫??Ohh Nice catch@Rico Crescenzio非常感谢你和我一起看。我做到了,但仍然是一样的问题。嗯,我在操场上试过了,效果很好;尝试
CMD+SHIFT+K
并再次运行它,我已经通过了几次代码清理项目,重新启动了Xcode,但它的基本实现仍然不起作用。这太疯狂了,一定还有其他东西。很好的catch@Rico Crescenzio非常感谢你和我一起看。我做到了,但仍然是一样的问题。嗯,我在操场上试过了,效果很好;尝试
CMD+SHIFT+K
并再次运行它,我已经通过了多次代码清理项目,重新启动Xcode,但它的基本实现仍然不工作。这太疯狂了,肯定还有其他原因,但仍然没有意义,委托不工作太棒回答:)哇!太棒了。成功了!祝您晚上愉快。@RicoCrescenzio For ex.如果您在
LoginVC
中有
var nameTextField=TGTextField()
。在
LoginVC
的“viewDidLoad”中,如果设置了
nameTextField.delegate=self
,则自定义类中的委托方法将不可用called@RajeshKumarR啊,对,我不明白你的意思,当然不行。这是最好的方法,但仍然没有意义,代表不工作真棒回答:)哇!太棒了。成功了!祝您晚上愉快。@RicoCrescenzio For ex.如果您在
LoginVC
中有
var nameTextField=TGTextField()
。在
LoginVC
的“viewDidLoad”中,如果设置了
nameTextField.delegate=self
,则自定义类中的委托方法将不可用called@RajeshKumarR啊,对,我不明白你的意思,当然不行。顺便说一句,这是最好的方法