UITextField有一个inputView的属性,可以通过给inputView赋值的方法给UITextField定制键盘。如下图所示,我们可以通过给UITextField自定义键盘,使它的输入控件为时间选择器:

实现过程如下:
首先,自定义一个继承自UITextField的类:
@interface BirthdayField : UITextField
@end
然后,我们初始化它的时候,给它指定一个inputView:
-(void)initTextValue
{
[self valueChange:self.datePicker];
}
-(instancetype)initWithFrame:(CGRect)frame
{
if(self == [super initWithFrame:frame])
{
[self initView];
}
return self;
}
-(void)awakeFromNib
{
[super awakeFromNib];
[self initView];
}
-(void)initView
{
UIDatePicker *date = [[UIDatePicker alloc]init];
//日期格式
date.datePickerMode = UIDatePickerModeDate;
//中国
date.locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
[date addTarget:self action:@selector(valueChange:) forControlEvents:UIControlEventValueChanged];
self.datePicker = date;
self.inputView = date;
}
-(void)valueChange:(UIDatePicker *)sender
{
NSLog(@"%@",sender.date);
NSDateFormatter *format = [[NSDateFormatter alloc]init];
format.dateFormat = @"yyyy-MM-dd";
self.text = [format stringFromDate:sender.date];
}
其次,调用的时候,我们可能不想让自定义的TextField中有用户通过其他键盘输入的内容,需要在它的代理方法中返回NO:
//是否允许用户自己输入
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSLog(@"%s",__func__);
return NO;
}
最后,我们可能需要在TextField刚获得焦点的时候给它一个默认值。这个时候,我们就需要写一个设置默认值的方法,并在代理方法-(void)textFieldDidBeginEditing: 中调用:
@interface BirthdayField : UITextField
-(void)initTextValue;
@end
-(void)initTextValue
{
[self valueChange:self.datePicker];
}
-(void)textFieldDidBeginEditing:(id )textField
{
if([textField respondsToSelector:@selector(initTextValue)])
{
[textField initTextValue];
}
}
附上demo地址:demo
网友评论