Reputation: 420
In my app, i need to use a lot of textfields and i don't really want that every viewcontroller class contains the delegates of textfields which could be messy, I just want to create a generic class where it takes care of the delegate of textfields and returns me a text field where i can add it as a subview where ever i need. I want to make it as a library and call the class whenever i need a textfield FOR example
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];
Is this possible??. Thanks in advance!!
Upvotes: 5
Views: 7937
Reputation: 4160
You can achieve this with better approach using blocks:
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)
}
}
}
Upvotes: 1
Reputation: 420
This helped me
@interface CustomTextField : UITextField <UITextFieldDelegate>
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.delegate = self;
}
return self;
}
added delegate to the customTextField class and it worked for me.
Thanks!!
Upvotes: 0
Reputation: 11037
As Midhun Answered you need to create a custom TextField class and also set delegate in that class. Like this
.h FIle
@interface CustomTextField : UITextField<UITextFieldDelegate> @end
.m File
@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
Upvotes: 7
Reputation: 107231
Create a subclass of UITextField
and use it.
@interface CustomTexTField : UITextField
@end
@implementation CustomTexTField
//Add the stuffs here
@end
wherever you need the text field you can use:
CustomTexTField *textField = [[CustomTextField alloc] initWithFrame:customFrame];
[self.view addSubView:textField];
Upvotes: 1