優(yōu)雅的創(chuàng)建一個UIDatePicker輸入鍵盤

前幾天在項目中碰到一個這樣的需求:需要在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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末导匣,一起剝皮案震驚了整個濱河市才菠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贡定,老刑警劉巖赋访,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缓待,居然都是意外死亡蚓耽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門旋炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來步悠,“玉大人,你說我怎么就攤上這事瘫镇《κ蓿” “怎么了答姥?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谚咬。 經(jīng)常有香客問我鹦付,道長,這世上最難降的妖魔是什么择卦? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任敲长,我火速辦了婚禮,結果婚禮上秉继,老公的妹妹穿的比我還像新娘祈噪。我一直安慰自己,他們只是感情好秕噪,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布钳降。 她就那樣靜靜地躺著,像睡著了一般腌巾。 火紅的嫁衣襯著肌膚如雪遂填。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天澈蝙,我揣著相機與錄音吓坚,去河邊找鬼。 笑死灯荧,一個胖子當著我的面吹牛礁击,可吹牛的內容都是我干的。 我是一名探鬼主播逗载,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼哆窿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厉斟?” 一聲冷哼從身側響起挚躯,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擦秽,沒想到半個月后码荔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡感挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年缩搅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片触幼。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡硼瓣,死狀恐怖,靈堂內的尸體忽然破棺而出置谦,到底是詐尸還是另有隱情巨双,我是刑警寧澤噪猾,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站筑累,受9級特大地震影響袱蜡,放射性物質發(fā)生泄漏。R本人自食惡果不足惜慢宗,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一坪蚁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镜沽,春花似錦敏晤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔬墩,卻和暖如春译打,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拇颅。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工奏司, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人樟插。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓韵洋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黄锤。 傳聞我的和親對象是個殘疾皇子搪缨,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容