2013-07-10 2 views
5

В моем приложении мне нужно использовать много текстовых полей, и я действительно не хочу, чтобы каждый класс viewcontroller содержал делегаты текстовых полей, которые могут быть беспорядочными, я просто хочу создать общий класс, где он заботится о делегировании текстовых полей и возвращает мне текстовое поле, где я могу добавить его в качестве подсмотра, где мне когда-либо понадобится. Я хочу, чтобы сделать его как библиотеку и вызвать класс всякий раз, когда мне нужно текстовое поле К примеруКак написать пользовательский класс UItextField

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]; 

Возможно ли это ??. Спасибо заранее!

ответ

7

Как Midhun Ответил вам нужно создать пользовательский класс TextField, а также установить делегат в этом классе. Как это

.h ФАЙЛА

@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 
+0

Спасибо @Parser Я не был уверен, следует ли использовать self.delegate = self; Спасибо, это мне очень помогло. – Vijay

1

Создайте подкласс UITextField и используйте его.

@interface CustomTexTField : UITextField 
@end 

@implementation CustomTexTField 

//Add the stuffs here 

@end 

везде, где вам нужно текстовое поле, которое вы можете использовать:

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

Я уже пробовал выше Но как я могу получить доступ к методам делегата, я не хочу, чтобы они были на класс контроллера, можно ли включить их в CustomTextField ?. @Midhun – Vijay

0

Это помогло мне

@interface CustomTextField : UITextField <UITextFieldDelegate> 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     self.delegate = self; 
    } 
return self; 
} 

добавил делегата в класс customTextField, и это сработало для меня.

Спасибо!

0

Вы можете добиться этого с более эффективным подходом с использованием блоков:

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

}

Смежные вопросы