UITextField是用來接受用戶輸入的控件,它的優點是靈活性大,用戶可以隨便輸入,但有時候這也是其缺點。對我們而言,典型的一個問題就是格式檢查。然而我們也會遇到想讓用戶輸入日期的時候,這個時候再進行格式檢查就有些小題大做了,畢竟iOS已經為我們提供了一個UIDatePicker來進行日期選擇,這樣一個很自然的想法就是當用戶點擊UITextField的時候彈出的不是鍵盤,而是我們的UIDatePicker。
一個簡單地方法是將自己的UIDatePicker直接賦給UITextField的inputView屬性,這樣還可以為其添加附加視圖,並且比較方便。
這裡我們用另一種方法實現以下,也就是通過UITextField的協議來實現。這種方法的好處是給了我們更大的靈活性,可以對整個inputView從彈出到使用到結束都能做到自定義。還能熟悉對UITextField的協議的理解。
假定我們有多個UITextField,然後只有其中一個是需要選擇日期的(多個的時候可以通過tag等方法來識別,大同小異)。
第一步,初始化。
將各個UITextField的協議都賦好,然後為其中需要彈出日期選擇器的單獨賦tag值(最好全都賦上,可以結合其他需要靈活調整),然後把一個UIDatePicker空間也給初始化。
示例:
//TextField
self.testTimeField.delegate = self;
self.testNameField.delegate = self;
self.testLocationField.delegate = self;
self.testOtherField.delegate = self;
self.testTimeField.tag = 1001;
self.testNameField.returnKeyType = UIReturnKeyDone;
self.testLocationField.returnKeyType = UIReturnKeyDone;
self.testOtherField.returnKeyType = UIReturnKeyDone;
//UIDatePicker
self.datePicker = [[UIDatePicker alloc] init];
self.datePicker.datePickerMode = UIDatePickerModeDateAndTime;
self.datePicker.minuteInterval = 30;
[self.datePicker addTarget:self action:@selector(chooseDate:) forControlEvents:UIControlEventValueChanged];這裡我們設置的動作是ValueChanged也就是說每當日期選擇器的值發生變化,即用戶選擇新的日期時,其綁定事件都會被觸發,所以在該方法中為我們的UITextField的text屬性賦值即可。
示例;
- (void)chooseDate:(UIDatePicker *)sender {
NSDate *selectedDate = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm";
NSString *dateString = [formatter stringFromDate:selectedDate];
self.testTimeField.text = dateString;
}
該方法的原型是- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;其返回值為布爾類型,當返回YES時鍵盤會彈出,而返回NO時鍵盤不會彈出,即textField不會被響應。而我們要做的就是當響應的textField是普通的textField的時候返回YES,而響應的textField是會彈出日期選擇器的時候返回NO。怎麼判斷呢?還記得我們之前設置過的tag值嗎?這裡就用上了。
另外,這裡有幾個小問題:1、注意UIDatePicker的及時隱藏,即當顯示鍵盤的時候它不應該再出現在後面了,否則鍵盤關閉後你會看到一個UIDatePicker赫然立在屏幕上。。
2、同樣,將要彈出UIatePicker的時候其他的鍵盤(如果在響應狀態)也應該關閉,這兩條的意思是,當用戶從一個textField直接點到另一個的時候,我們的應用應該能正確處理鍵盤和日期選擇器的關系。
3、動畫的應用。這個比較簡單,讓日期選擇器像鍵盤一樣彈出關閉。
示例:
#pragma mark - UITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
//如果當前要顯示的鍵盤,那麼把UIDatePicker(如果在視圖中)隱藏
if (textField.tag != 1001) {
if (self.datePicker.superview) {
[self.datePicker removeFromSuperview];
}
return YES;
}
//UIDatePicker以及在當前視圖上就不用再顯示了
if (self.datePicker.superview == nil) {
//close all keyboard or data picker visible currently
[self.testNameField resignFirstResponder];
[self.testLocationField resignFirstResponder];
[self.testOtherField resignFirstResponder];
//此處將Y坐標設在最底下,為了一會動畫的展示
self.datePicker.frame = CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, 216);
[self.view addSubview:self.datePicker];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
self.datePicker.bottom -= self.datePicker.height;
[UIView commitAnimations];
}
return NO;
}