前幾天在項目中碰到一個這樣的需求:需要在textField中輸入日期鲁僚,輸入的時候彈出datePicker選擇日期。心想很簡單啊裁厅,無非就是把textField的inputView屬性設置為UIDatePicker的實例即可啊冰沙。然后在UIDatePicker的pickerValueChanged事件中更新textField的值就可以了啊。我開始是這么做的:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIDatePicker *picker = [[UIDatePicker alloc] init];
picker.datePickerMode = UIDatePickerModeDate;
[picker addTarget:self action:@selector(pickerValueChanged:) forControlEvents:UIControlEventValueChanged];
self.firstTextField.inputView = picker;
}
- (void)pickerValueChanged:(UIDatePicker *)sender
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
self.firstTextField.text = [formatter stringFromDate:sender.date];
}
恩执虹,運行的很好港庄。等等,老板來了說一句棵譬,這么快搞好了啊凳宙,那這個view上面再加幾個日期輸入框吧〔绻剩客戶查詢起始時間盖灸,還要有結束時間啊。好吧磺芭,這個也不難的赁炎,拉一個textField。如法炮制钾腺,在viewDidLoad屁股后面加上:
self.secondTextField.inputView = picker;
然后為了避免輸入沖突徙垫,在textField的delegate方法中記錄當前輸入框:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
self.currentDateTextField = textField;
}
并修改pickerValueChanged方法。
- (void)pickerValueChanged:(UIDatePicker *)sender
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
self.currentDateTextField.text = [formatter stringFromDate:sender.date];
}
ok了放棒。但是姻报,后面做的過程中發(fā)現(xiàn)這個界面不只有輸入日期的textField,還有其他的普通textField啊间螟。那只能修改currentDateTextField的記錄條件了吴旋。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
if (textField == self.firstTextField ||
textField == self.secondTextField)
{
self.currentDateTextField = textField;
}
}
好的,這個界面搞定了厢破,老板又來說邮府。后面有幾個界面也是這樣的,需要加幾個日期選擇輸入框溉奕。媽蛋肮涌!那不是又得再其他的viewController中加入這些代碼加勤,設置delegate仙辟,實現(xiàn)delegate方法同波。實話說,這代碼量也不大啊叠国。但是這個代碼放到viewController中未檩,一是無法復用,二是這樣寫好搓粟焊!代碼都是一樣的冤狡,應該抽出來復用!
于是项棠,我寫了一個textField的category悲雳,直接用一個屬性datePickerInput來設置UIDatePicker的鍵盤。下面是頭文件:給textField增加一個屬性datePickerInput香追,category是不能直接添加實例變量的合瓢,這個datePickerInput會在實現(xiàn)文件里面實現(xiàn)相應的setter和getter。sharedDatePicker類方法是為所有的UITextField生成一個共享的UIDatePicker透典,并提供調用接口晴楔。
#import <UIKit/UIKit.h>
@interface UITextField (DatePicker)
@property (nonatomic, assign) BOOL datePickerInput;
+ (UIDatePicker *)sharedDatePicker;
@end
下面是m文件:
#import "UITextField+DatePicker.h"
@implementation UITextField (DatePicker)
// 1、模仿單例方法
+ (UIDatePicker *)sharedDatePicker;
{
static UIDatePicker *daterPicker = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
daterPicker = [[UIDatePicker alloc] init];
daterPicker.datePickerMode = UIDatePickerModeDate;
});
return daterPicker;
}
// 2
- (void)datePickerValueChanged:(UIDatePicker *)sender
{
if (self.isFirstResponder)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd"];
self.text = [formatter stringFromDate:sender.date];
}
}
// 3
- (void)setDatePickerInput:(BOOL)datePickerInput
{
if (datePickerInput)
{
self.inputView = [UITextField sharedDatePicker];
[[UITextField sharedDatePicker] addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
}
else
{
self.inputView = nil;
[[UITextField sharedDatePicker] removeTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
}
}
// 4
- (BOOL)datePickerInput
{
return [self.inputView isKindOfClass:[UIDatePicker class]];
}
end
代碼很簡單峭咒,1處是套用單例的寫法初始化一個全局的datePicker税弃;2處設置text,此處必須判斷是不是isFirstResponder凑队;3和4是setter和getter则果。
后面再加上日期選擇輸入框的時候,只需要這樣寫就行了:
self.firstTextField.datePickerInput = YES;
self.secondTextField.datePickerInput = YES;
恩顽决,比之前好多了!
完整的demo項目在這里:https://github.com/tujinqiu/KTTextFieldDatePickerKeyBoard