Как отобразить UIDatePicker, если пользователь программно нажмет на поле UITextfield

Я хотел бы отображать UIDatePicker только тогда, когда пользователь щелкает UITextField. Когда дата выбрана, она должна отображаться в том же UITextField. Я хочу реализовать UIDatePicker программно. Я знаю, как написать код UITextField программно. Я даже не знаю, как вызвать UIDatePicker.

Дата Рождения.m

UITextField txtDOB=[[UITextField alloc]initWithFrame:CGRectMake(10, 190, 300, 20)];

txtDOB.borderStyle=UITextBorderStyleNone;

txtDOB.backgroundColor=[UIColor clearColor];

[txtDOB setUserInteractionEnabled:NO];

txtDOB.font=[UIFont systemFontOfSize:14.0];

txtDOB.contentVerticalAlignment=UIControlContentVerticalAlignmentCenter;

txtDOB.textAlignment=NSTextAlignmentLeft;

txtDOB.delegate=self;

[self.view addSubview:txtDOB];

person user2930730    schedule 09.01.2014    source источник


Ответы (7)


Самый простой способ реализовать datePicker следующим образом:

Создайте datePicker:

self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectZero];
[self.datePicker setDatePickerMode:UIDatePickerModeDate];
[self.datePicker addTarget:self action:@selector(onDatePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

Затем свяжите datePicker с textfield inputView:

self.textField.inputView = self.pickerView;

В конце концов, вы можете поймать действие, когда была выбрана дата, и преобразовать дату в строку, чтобы показать выбранную дату в textField

- (void)onDatePickerValueChanged:(UIDatePicker *)datePicker
{
    self.textField.text = [self.dateFormatter stringFromDate:datePicker.date];
}
person Fabio Berger    schedule 09.01.2014
comment
Свойство NSDateFormatter, я использую его для преобразования даты в строку - person Fabio Berger; 11.06.2019

Прежде чем перейти к этому коду, вам нужно просто знать о UIActionSheet и вам нужно реализовать UIActionShetDelegate и UITextFieldDelegate В textFieldDidBeginEditing вам нужно показать лист действий, как показано ниже:

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
   UIActionSheet *asheet = [[UIActionSheet alloc] initWithTitle:@"Select Date" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Select", nil];
  [asheet showInView:[self.view superview]];
  [asheet setFrame:CGRectMake(0, 117, 320, 383)];
}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
  {
    UIDatePicker *pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 40, 320, 240)];

   [pickerView setMinuteInterval:5];
   [pickerView setTag: DatePickerTag];

  [actionSheet addSubview:pickerView];
  NSArray *subviews = [actionSheet subviews];

  [[subviews objectAtIndex:SelectButtonIndex] setFrame:CGRectMake(20, 250, 280, 46)];
  [[subviews objectAtIndex:CancelButtonIndex] setFrame:CGRectMake(20, 300, 280, 46)];

}
person Mani    schedule 09.01.2014

  • Сначала укажите, что ваш класс соответствует протоколу UITextFieldDelegate

  • Затем в viewDidLoad установите delegate и tag вашего текстового поля.

     yourTextField.delegate = self;  
     yourTextField.tag = 111;
    
  • Затем реализуйте следующий метод делегата:

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {   
        if (textField.tag==111) {  
            [self showDatePicker];  
        }  
        return YES;  
    }
    
  • Теперь реализуйте функцию showDatePicker

    - (void)showDatePicker {  
        datePicker = [[UIDatePicker alloc] init];
        datePicker.backgroundColor=[UIColor whiteColor];
    
        UIToolbar *toolbar = [[UIToolbar alloc]init];
        [toolbar sizeToFit];
    
        UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(showSelectedDate)];    
    
        doneBtn.tintColor = [UIColor whiteColor];  
    
        UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];    
    
        toolbar.backgroundColor = [UIColor colorWithRed:5.0/255.0 green:110.0/255.0 blue:170.0/255.0 alpha:1];  
    
        [toolbar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft,doneBtn ,nil]];  
    
        [yourTextField setInputAccessoryView:toolBar];  
    
        yourTextField.inputView = datePicker;   
    }
    

ИЛИ вы можете сделать это просто в своем viewDidLoad следующим образом:

datePicker = [[UIDatePicker alloc] init];
datePicker.backgroundColor = [UIColor whiteColor];  

UIToolbar *toolbar = [[UIToolbar alloc]init]; 

[toolbar sizeToFit];    

 UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self
 action:@selector(showSelectedDate)];    

 doneBtn.tintColor = [UIColor whiteColor];  

 UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
 target:nil action:nil];    

toolbar.backgroundColor = [UIColor colorWithRed:5.0/255.0 green:110.0/255.0 blue:170.0/255.0 alpha:1];  

[toolBar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft, doneBtn , nil]];  

[yourTextField setInputAccessoryView:toolbar];  

yourTextField.inputView = datePicker;
person vky    schedule 17.02.2017

Вам нужно добавить правильный селектор, когда начинается редактирование UITexfield, используйте код ниже

 [txtDOB addTarget:self action:@selector(textbeginEditing:) forControlEvents:UIControlEventEditingDidBegin];

А затем реализуйте метод textbeginEditing, чтобы открыть средство выбора даты.

-(void)textbeginEditing:(id)sender{

UIActionSheet __autoreleasing * date_sheet = [[UIActionSheet alloc] initWithTitle:@"Select the date" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];

date_sheet.tag = 2;

[date_sheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];

CGRect pickerFrame = CGRectMake(0, 40, 0, 0);

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:pickerFrame];

datePicker.datePickerMode = UIDatePickerModeDate;
datePicker.hidden = NO;
datePicker.date = [NSDate date];

// Implement the method labelChange
 [datePicker addTarget:self
                action:@selector(labelChange:)
      forControlEvents:UIControlEventValueChanged];


[date_sheet addSubview:datePicker];

UISegmentedControl __autoreleasing *closeButton = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:@"Close"]];

closeButton.momentary = YES;    
closeButton.frame = CGRectMake(260, 7.0f, 50.0f, 30.0f);    
closeButton.segmentedControlStyle = UISegmentedControlStyleBar;    
closeButton.tintColor = [UIColor blackColor];

[closeButton addTarget:self action:@selector(dissmissDatePicker:) forControlEvents:UIControlEventValueChanged];

[date_sheet addSubview:closeButton];
[date_sheet showInView:[[UIApplication sharedApplication] keyWindow]];    
[date_sheet setBounds:CGRectMake(0, 0, 320, 400)];
}

Реализация метода labelChange

-(void)labelChange:(UIDatePicker *)sender{
NSDateFormatter __autoreleasing *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
[dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
 dateFormat.dateStyle = NSDateFormatterMediumStyle;
 NSString *dateString =  [dateFormat stringFromDate:sender.date];
 txtDOB.text = dateString; 
}
person Gyanendra Singh    schedule 09.01.2014
comment
@GGyanendra Сингх. Спасибо за ваш ответ. Но он не будет работать, брат. Получая некоторые ошибки в реализации метода labelChange. - person user2930730; 09.01.2014
comment
txtDOB.text = дата, эта строка может быть причиной ошибки. Объявите это как ivar в (файле .h) или получите экземпляр текстового поля по тегу, например. UITextField *textField = (UITextField *)[self.view viewWithTag:i]; //набор тегов для текстового поля txtDOB. - person Gyanendra Singh; 09.01.2014
comment
Нет, брат... NSLog(@****** Дата %@, createDate); NSString *date = [dateFormat stringFromDate:sender.date]; txtDOB.текст = дата; Эти две строчки - ошибки брат - person user2930730; 09.01.2014
comment
Я бы сказал, почему бы вам не использовать UIButton с тем же фоновым изображением, что и текстовое поле (оно будет имитировать текстовое поле). Я делал это много, это тоже на востоке. - person Gyanendra Singh; 09.01.2014
comment
хорошо, брат, если у вас есть код UIButton с тем же фоновым изображением, что и текстовое поле, обновите код. - person user2930730; 09.01.2014
comment
проверьте это: stackoverflow.com /questions/6074683/, stackoverflow.com/questions/12828398/ - person Dhaval Bhadania; 09.01.2014
comment
Создайте кнопку программно (как вы делаете для текстового поля), измените ее фоновое изображение, используя [btnDOB setBackgroundImage:[UIImage imageNamed:@txtfield.png] forState:UIControlStateNormal], добавьте селектор, используя [btnDOB addTarget:self action:@selector( textbeginEditing:) forControlEvents:UIControlEventTouchUpInside]; что-то вроде этого. - person Gyanendra Singh; 09.01.2014

Это будет просто, попробуйте это
Когда U щелкает текстовое поле, вызывается этот метод.

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

Затем мы не хотим отображать клавиатуру.

[textField resignFirstResponder];  

Затем, чтобы отобразить datePicker

datePicker=[[UIDatePicker alloc]init];
[datePicker setFrame:CGRectMake(<ur dimension>)];
datePicker.datePickerMode=UIDatePickerModeDateAndTime;
datePicker.timeZone = [NSTimeZone localTimeZone];
[datePicker addTarget:self action:@selector(done) forControlEvents:UIControlEventValueChanged];  

Это отобразит datePicker.
Затем вы хотите отобразить выбранное значение в textField

-(void)done
{
  NSString *dateStri=[dateFormater stringFromDate:datePicker.date];
    [timingTextField setText:[NSString stringWithFormat:@"%@",dateStri]];
}  

Попробуйте это и сообщите мне результат

person chandru    schedule 09.01.2014
comment
Ты получил это? подтвердить мой ответ - person chandru; 09.01.2014

Сначала включите userIntraction

[txtDOB setUserInteractionEnabled:YES];

и добавьте представление выбора в качестве входного представления этого текстового поля

[txtDOB setInputView:pickerview]

person Tapas Pal    schedule 09.01.2014

person    schedule
comment
Это лучший способ добавить средство выбора даты в текстовое поле и получить клавиатуру по умолчанию, такую ​​​​как анимация и поведение. - person HarshIT; 09.01.2014
comment
Ага !! и легко реализовать с точки зрения строки кода @HarshIT - person iDeveloper; 09.01.2014
comment
@IРазработчик. Спасибо за ответ. Но это не работает, брат. Если я нажму на текстовое поле, UIDatePicker не будет отображаться - person user2930730; 09.01.2014
comment
Не могли бы вы обновить свой код, чтобы я мог отредактировать и вернуть вам @user2930730 - person iDeveloper; 09.01.2014