Ios 委托方法未在UITextField自定义子类中调用
我正在从UITextField类创建一个自定义子类。我想在textfield处于焦点时应用一些东西。但是在我的自定义类中,我的委托方法没有调用 我创建了一个子类,它扩展了UITextField类并进行了一些定制 在TGTextField类中: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)!
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啊,对,我不明白你的意思,当然不行。顺便说一句,这是最好的方法