2013-07-10 63 views
5

在我的应用程序,我需要使用大量的文本框的,我真的不希望每一个视图控制器类包含文本框的代表可能是凌乱的,我只是想创建一个通用类的地方,它照顾的文本字段的委托,并返回一个文本字段,我可以将它添加为子视图,我需要的地方。我希望把它作为一个库,然后调用类每当我需要一个文本框 例如如何编写自定义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文件

@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 =自我;感谢它真的帮助了我。 – 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) 
    } 
} 

}