我创建了UITextField的子类,该子类执行不同的电子邮件,显示名和密码检查。我还向UIViewController添加了UITextFieldDelegate扩展。到目前为止,我已经在视图控制器中将每个文本字段的委托设置为self,并且一切正常。但是,我想在创建子类的实例时在子类内部自动设置委托。
我假设我必须以某种方式获得在其中创建自定义文本字段的视图控制器,但似乎无法进行管理。到目前为止,我发现的解决方案已经过时,或者不适用于我的代码。
当我创建一个新的文本字段时,我要做的就是在界面构建器中分配我的自定义类并设置字段类型。如果我在子类化和为UIViewController创建可重用扩展方面的一般方法是错误的,请告诉我应该朝哪个方向发展。
这是我的子类和扩展名:
import UIKit
enum fieldType {
case notSet
case password
case email
case displayName
}
class UIUserAuthTextField: UITextField {
var fieldType: fieldType = .notSet
delegate = //How do I properly assign or initialize the delegate inside this subclass?
func checkDisplayName() {
//do something
}
func checkEmailString() {
//do something
}
//additional subclass methods
}
extension UIViewController: UITextFieldDelegate {
public func textFieldDidEndEditing(_ textField: UITextField) {
let textField = textField as! UIUserAuthTextField
if textField.fieldType == .displayName {
textField.checkDisplayName()
}
if textField.fieldType == .email {
textField.checkEmailString()
}
}
//additional delegate methods
}
只需删除与委托有关的所有内容,所有相关内容都将由基类处理,即UITextField
class UIUserAuthTextField: UITextField {
var fieldType: fieldType = .notSet
func checkDisplayName() {
//do something
}
func checkEmailString() {
//do something
}
//additional subclass methods
}
更新:为控制器添加了协议,该协议将为UIUserAuthTextField
扮演代理角色>
protocol UIUserAuthTextFieldDelegate: UITextFieldDelegate {}
extension UIUserAuthTextFieldDelegate {
public func textFieldDidEndEditing(_ textField: UITextField) {
if let textField = textField as? UIUserAuthTextField {
if textField.fieldType == .displayName {
textField.checkDisplayName()
}
if textField.fieldType == .email {
textField.checkEmailString()
}
}
}
//additional delegate methods
}