2009-08-14 7 views
14

Mam widok tabeli, który ma osadzone UITextFields do wprowadzania niektórych danych. Ma również dwa inne pola, które wyskakują UIPickerView i UIDatePicker - jak pokazano w przykładzie DateCell firmy Apple.Elegancko wymień klawiaturę iPhone'a na UIPickerView

Przeważnie działa, ale nie mogę wymyślić, jak czysto przejść z klawiatury pola tekstowego do innych zbieraczy - jeden wysuwa się, jeden wsuwa się - wygląda dziwnie, a pozycja przewijania w widoku tabeli czasami jest przykręcana w górę - wszystko przewinie się od góry.

Chciałbym zastąpić klawiaturę pola tekstowego bez animowania i bez powiększania widoku tabeli do pełnego rozmiaru.

Jakieś wskazówki?

Odpowiedz

31

Po pierwsze, tutaj jest screencapture showing how this looks.

Implementacja UITextFieldDelegate i wyświetl "popup" zawierający UIPickerView.

- (void)textFieldDidEndEditing:(UITextField *)textField { 

    UIPickerView *picker = [[UIPickerView alloc] 
           initWithFrame:CGRectMake(0, 244, 320, 270)]; 
    picker.delegate = self; 
    picker.dataSource = self; 
    [self.view addSubview:picker]; 
    [picker release]; 
} 

Gdy klawiatura zniknie, wówczas widoczny jest widok wyboru.

Jeśli chcesz zrobić to nieco dalej, możesz animować widok "wsuń" UIPickerView jako klawiaturę.

- (void)viewDidLoad { 

    //picker exists in the view, but is outside visible range 
    picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 480, 320, 270)]; 
    picker.delegate = self; 
    picker.dataSource = self; 
    [self.view addSubview:picker]; 
    [picker release]; 
} 

//animate the picker into view 
- (void)textFieldDidEndEditing:(UITextField *)textField { 

    [UIView beginAnimations:@"picker" context:nil]; 
    [UIView setAnimationDuration:0.5]; 

    picker.transform = CGAffineTransformMakeTranslation(0,-236); 
    [UIView commitAnimations]; 

} 

//animate the picker out of view 
- (void)textFieldDidBeginEditing:(UITextField *)textField { 

    [UIView beginAnimations:@"picker" context:nil]; 
    [UIView setAnimationDuration:0.5]; 

    picker.transform = CGAffineTransformMakeTranslation(0,236); 
    [UIView commitAnimations]; 
} 

//just hide the keyboard in this example 
- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return NO; 
} 
+0

Dziękuję za tę odpowiedź. – camilo

+12

Tak jak na marginesie, jest to stary sposób na zrobienie tego. Bardziej "nowoczesna" wersja używałaby właściwości inputView pola tekstowego. –

29

Wystarczy ustawić właściwość inputView UITextField na UIPickerView.

+0

O wiele lepiej, ale nie wygląda to dobrze na iPadzie. – TMB

+0

Sprawdziłbym tę odpowiedź i nie ustawiłem jej na styl datepicker: http://stackoverflow.com/questions/4777237/iphone-datepicker-instead-of-keyboard – LordParsley