Алгоритм: перехватим событие - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField у UITextField и вместо показа системной клавиатуры, покажем наше вью.
Думаю не стоит описывать процесс создания и назначения делегата у UITextField, это можно сделать как в Interface Builder-е так и динамически. Сразу смотрим метод делегата -(void)textFieldDidBeginEditing:(UITextField *)textField:
- (void)textFieldDidBeginEditing:(UITextField *)aTextField { [aTextField resignFirstResponder]; [_pickerViewPopup release]; _pickerViewPopup = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; [_pickerView release]; _pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0.0, 44.0, 0.0, 0.0)]; _pickerView.datePickerMode = UIDatePickerModeDate; _pickerView.hidden = NO; _pickerView.date = [NSDate date]; [_pickerView addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)]; pickerToolbar.barStyle = UIBarStyleBlackOpaque; [pickerToolbar sizeToFit]; NSMutableArray *barItems = [[NSMutableArray alloc] init]; UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; [barItems addObject:flexSpace]; [flexSpace release]; UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonPressed:)]; [barItems addObject:doneBtn]; [doneBtn release]; UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonPressed:)]; [barItems addObject:cancelBtn]; [cancelBtn release]; [pickerToolbar setItems:barItems animated:YES]; [barItems release]; [_pickerViewPopup addSubview:pickerToolbar]; [_pickerViewPopup addSubview:_pickerView]; [_pickerViewPopup showInView:self.window]; [_pickerViewPopup setBounds:CGRectMake(0.0, 0.0, 320.0, 464.0)]; [pickerToolbar release]; }
тут мы создаем модальное окно, на основе UIActionSheet и в него вставляем UIDatePicker и UIToolbar с кнопками "Ok" и "Cancel".
И события нажатия на эти кнопки:
- (void)doneButtonPressed:(id)sender { self.dt = [_pickerView date]; [_pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; [_pickerView removeTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; } - (void)cancelButtonPressed:(id)sender { [_pickerViewPopup dismissWithClickedButtonIndex:1 animated:YES]; [_pickerView removeTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; }
В обоих случаях скрываем наше "модельное" окно и отписываемся от события получения нотификации о изменении даты на UIDatePicker. А при нажатии на "Ok" так-же сохраняем выбранную дату на "барабане".
И событие изменения даты на UIDatePicker для изменения даты так-же в текстовом поле:
- (void)dateChanged { NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd.MM.yy"]; _tf.text = [df stringFromDate:[_pickerView date]]; }
Проект на github-е. Утащено с stackoverflow.