iOS開發——點擊UITextField彈出UIDatePicker的協議實現方法

來源:互聯網
上載者:User

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.