Алгоритм: перехватим событие - (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.
