iOS開發——點選UITextField彈出UIDatePicker的協議實現方法
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];
第二部、實現UIDatePicker的事件
這裡我們設定的動作是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; }
第三步、實現UITextField的-textFieldShouldBeginEditing:方法,在該方法中處理鍵盤和UIDatePicker的彈出邏輯
該方法的原型是- (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;
}