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; }