2013-07-10 16 views
5

In meiner App muss ich viele Textfelder verwenden und ich möchte nicht wirklich, dass jede ViewController-Klasse die Delegaten von Textfeldern enthält, die chaotisch sein könnte, ich möchte nur ein generisches erstellen Klasse, wo es sich um den Delegierten von Textfeldern kümmert und mir ein Textfeld zurückgibt, wo ich es als Unteransicht hinzufügen kann, wo immer ich es brauche. Ich möchte es als eine Bibliothek machen und die Klasse rufen, wenn ich ein Textfeld zum Beispiel brauchenWie schreibe ich eine benutzerdefinierte UItextField Klasse

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

Ist das möglich ??. Vielen Dank im Voraus !!

Antwort

7

Als Midhun Sie eine benutzerdefinierte Textfield-Klasse und auch gesetzt Delegierten in dieser Klasse erstellen Beantwortet müssen. Gefallen Sie diese

.h-Datei

@interface CustomTextField : UITextField<UITextFieldDelegate> 
@end 

.m Datei

@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

Danke @Parser Ich war mir nicht sicher, ob wir self.delegate = self verwenden sollten; Danke, es hat mir wirklich geholfen. – Vijay

1

Erstellen Sie eine Unterklasse von UITextField und verwenden Sie sie.

@interface CustomTexTField : UITextField 
@end 

@implementation CustomTexTField 

//Add the stuffs here 

@end 

wo müssen Sie das Textfeld können Sie:

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

Ich habe bereits versucht, die oben Aber wie kann ich die Delegatmethoden zugreifen, ich will sie nicht auf das sein View Controller Klasse, wird es möglich sein, sie in CustomTextField? @Midhun – Vijay

0

Das half mir

@interface CustomTextField : UITextField <UITextFieldDelegate> 

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

Delegat zur customTextField-Klasse hinzugefügt und es funktionierte für mich.

Danke !!

0

Sie können dies erreichen, mit einer besseren Ansatz Blöcke:

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

}

Verwandte Themen