如何编写一个自定义的UItextField类

在我的应用程序中,我需要使用大量的文本字段,而且我不是真的希望每个viewcontroller类都包含textfields的代表,这些代码可能是混乱的,我只是想创build一个generics的类来处理文本字段的委托并返回我一个文本字段,我可以添加它作为一个子视图,我需要的地方。 我想把它作为一个图书馆,每当我需要一个文本字段,例如调用类

CustomTexTField *textField = [[CustomTextField alloc] initWithFrame:Frame]; // returns a textField whose delegate will be set to CustomTextField // // all i should do is just adding it as a subView // [self.view addSubView:textField]; 

这可能吗??。 提前致谢!!

作为Midhun回答,你需要创build一个自定义的TextField类,并在该类中设置委托。 喜欢这个

.h文件

 @interface CustomTextField : UITextField<UITextFieldDelegate> @end 

.m文件

 @implementation CustomTextField - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code self.delegate = self; } return self; } - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ return YES; } - (void)textFieldDidBeginEditing:(UITextField *)textField{ } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ return YES; } - (void)textFieldDidEndEditing:(UITextField *)textField{ } - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField{ return YES; } - (BOOL)textFieldShouldReturn:(UITextField *)textField{ return YES; } @end 

创buildUITextField的子类并使用它。

 @interface CustomTexTField : UITextField @end @implementation CustomTexTField //Add the stuffs here @end 

无论您需要哪种文本字段,都可以使用:

 CustomTexTField *textField = [[CustomTextField alloc] initWithFrame:customFrame]; [self.view addSubView:textField]; 

这帮助了我

 @interface CustomTextField : UITextField <UITextFieldDelegate> - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.delegate = self; } return self; } 

将委托添加到customTextField类,它为我工作。

谢谢!!

你可以使用更好的方法来实现这一点:

 class MyTextField: UITextField, UITextFieldDelegate { //MARK:- PROPERTIES var shouldPreventAllActions:Bool = false var canCut:Bool = true var canCopy:Bool = true var canPaste:Bool = true var canSelect:Bool = true var canSelectAll:Bool = true var blockTextFieldShouldChangeCharactersInRangeWithReplacementString:((_ textField: UITextField, _ range: NSRange, _ string: String) -> Bool)? var blockTextFieldShouldReturn:((_ textField: UITextField) -> Bool)? var blockTextFieldShouldClear:((_ textField: UITextField) -> Bool)? //MARK:- var blockTextFieldShouldBeginEditing:((_ textField: UITextField) -> Bool)? var blockTextFieldShouldEndEditing:((_ textField: UITextField) -> Bool)? //MARK:- var blockTextFieldDidBeginEditing:((_ textField: UITextField) -> Void)? var blockTextFieldDidEndEditing:((_ textField: UITextField) -> Void)? var blockTextFieldDidEndEditingWithReason:((_ textField: UITextField, _ reason: UITextFieldDidEndEditingReason) -> Void)? //MARK:- INIT override init(frame: CGRect) { super.init(frame: frame) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func awakeFromNib() { super.awakeFromNib() commonInit() } private func commonInit(){ // common initialization code.. } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if(self.shouldPreventAllActions){ return false } switch action { case #selector(UIResponderStandardEditActions.cut(_:)): return self.canCut ? super.canPerformAction(action, withSender: sender) : self.canCut case #selector(UIResponderStandardEditActions.copy(_:)): return self.canCopy ? super.canPerformAction(action, withSender: sender) : self.canCopy case #selector(UIResponderStandardEditActions.paste(_:)): return self.canPaste ? super.canPerformAction(action, withSender: sender) : self.canPaste case #selector(UIResponderStandardEditActions.select(_:)): return self.canSelect ? super.canPerformAction(action, withSender: sender) : self.canSelect case #selector(UIResponderStandardEditActions.selectAll(_:)): return self.canSelectAll ? super.canPerformAction(action, withSender: sender) : self.canSelectAll default: return super.canPerformAction(action, withSender: sender) } } //MARK:- DELEGATE func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if(self.blockTextFieldShouldChangeCharactersInRangeWithReplacementString != nil){ return self.blockTextFieldShouldChangeCharactersInRangeWithReplacementString!(textField,range,string) }else{ return true } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { if(self.blockTextFieldShouldReturn != nil){ return self.blockTextFieldShouldReturn!(textField) }else{ return true } } func textFieldShouldClear(_ textField: UITextField) -> Bool { if(self.blockTextFieldShouldClear != nil){ return self.blockTextFieldShouldClear!(textField) }else{ return true } } //MARK:- func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { if(self.blockTextFieldShouldBeginEditing != nil){ return self.blockTextFieldShouldBeginEditing!(textField) }else{ return true } } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { if(self.blockTextFieldShouldEndEditing != nil){ return self.blockTextFieldShouldEndEditing!(textField) }else{ return true } } //MARK:- func textFieldDidBeginEditing(_ textField: UITextField) { if(self.blockTextFieldDidBeginEditing != nil){ self.blockTextFieldDidBeginEditing!(textField) } } func textFieldDidEndEditing(_ textField: UITextField) { if(self.blockTextFieldDidEndEditing != nil){ self.blockTextFieldDidEndEditing!(textField) } } func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) { if(self.blockTextFieldDidEndEditingWithReason != nil){ self.blockTextFieldDidEndEditingWithReason!(textField,reason) } } 

}