1. 程式人生 > >iOS開發——點選UITextField彈出UIDatePicker的協議實現方法

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