¿Cómo agregar UIDatePicker en UIAlertController en iOS8?

Estoy trabajando en un proyecto que ya había lanzado con iOS-7. Pero ahora, como la hoja de acción está causando problemas, ahora estoy implementando UIAlertController. A continuación se muestra el código que utilizo para mostrar UIAlertController con UIPicker.

alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" prefernetworkingStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [alertController addAction:alertAction]; [pickerToolbar setFrame:CGRectMake(0, 0, self.view.frame.size.width-20, 44)]; [alertController.view addSubview:pickerToolbar]; [alertController.view addSubview:picker]; [alertController.view setBounds:CGRectMake(0, 0, self.view.frame.size.width, 485)]; [self presentViewController:alertController animated:YES completion:nil]; 

Pero no puedo agregar datepicker en él. No funciona igual que el selector normal y la aplicación se cuelga. Por favor, consejos para cualquier código de ejemplo para agregar UIDatePicker en UIAlertController. Gracias por adelantado

La adición de UIDatePicker a la hoja de acción fue desalentada por Apple desde el principio. Desde iOS 7, Apple introdujo el uso del selector de date en línea (ver cómo se hace en la aplicación Calendario).

Si consiguió piratear una solución alternativa con UIAlertController, es probable que se rompa nuevamente en futuras versiones de iOS.

esto me funciona

 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n" message:nil prefernetworkingStyle:UIAlertControllerStyleActionSheet]; UIDatePicker *picker = [[UIDatePicker alloc] init]; [picker setDatePickerMode:UIDatePickerModeDate]; [alertController.view addSubview:picker]; [alertController addAction:({ UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { NSLog(@"OK"); NSLog(@"%@",picker.date); }]; action; })]; UIPopoverPresentationController *popoverController = alertController.popoverPresentationController; popoverController.sourceView = sender; popoverController.sourceRect = [sender bounds]; [self presentViewController:alertController animated:YES completion:nil]; 

Para iOS9 + código Swift aquí.

agregue el objective al button de date u otra vista.

  dateBtn.addTarget(self,action: #selector(YourViewController.dateSelect(_:)),forControlEvents: UIControlEvents.TouchDown) //my date button func dateSelect(sender:UIButton) { if (UI_USER_INTERFACE_IDIOM() == .Phone) { //init date picker self.datePicker = UIDatePicker(frame: CGRectMake(0, 0, self.view.frame.size.width,260)) self.datePicker.datePickerMode = UIDatePickerMode.Date //add target self.datePicker.addTarget(self, action: #selector(YourViewController.dateSelected(_:)), forControlEvents: UIControlEvents.ValueChanged) //add to actionsheetview if(UIDevice.currentDevice().systemVersion >= "8.0") { let alertController = UIAlertController(title: "Date Selection", message:" " , prefernetworkingStyle: UIAlertControllerStyle.ActionSheet) alertController.view.addSubview(self.datePicker)//add subview let cancelAction = UIAlertAction(title: "Done", style: .Cancel) { (action) in self.dateSelected(self.datePicker) self.tableView.reloadData() } //add button to action sheet alertController.addAction(cancelAction) let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 300) alertController.view.addConstraint(height); self.presentViewController(alertController, animated: true, completion: nil) } } } //selected date func func dateSelected(datePicker:UIDatePicker) { let dateFormatter = NSDateFormatter() dateFormatter.dateStyle = NSDateFormatterStyle.ShortStyle let currentDate = datePicker.date let day = currentDate.day() let month = currentDate.month() let year = currentDate.year() let date = "\(day)/\(month)/\(year)" print(date) } 

Aquí está mi código que se testing tanto en iOS 7 como en iOS 8

  - (id)initWithDatePicker:(NSString*)title parentView:(UIView*)parentView { self = [super init]; if (self) { datePickerView = [[UIDatePicker alloc] init]; datePickerView.datePickerMode = UIDatePickerModeDateAndTime; if (IS_IOS8_AND_UP) { alertViewController = [UIAlertController alertControllerWithTitle:EMPTY_STRING message:title prefernetworkingStyle:UIAlertControllerStyleActionSheet]; UIView* aboveBlurLayer = alertViewController.view.subviews[0]; [aboveBlurLayer addSubview:datePickerView]; [aboveBlurLayer setWidth:SCREEN_WIDTH - 16]; [datePickerView setWidth:SCREEN_WIDTH - 16]; [alertViewController.view setWidth:SCREEN_WIDTH - 16]; [alertViewController.view setBackgroundColor:[UIColor whiteColor]]; UIAlertAction* alertAction = [UIAlertAction actionWithTitle:EMPTY_STRING style:UIAlertActionStyleDefault handler:nil]; [alertViewController addAction:alertAction]; [alertViewController addAction:alertAction]; [alertViewController addAction:alertAction]; [alertViewController addAction:alertAction]; [datePickerView setBackgroundColor:[UIColor whiteColor]]; [aboveBlurLayer addSubview:datePickerView]; } else { actionSheet = [[UIActionSheet alloc] initWithTitle:title delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; [actionSheet addSubview:datePickerView]; } [self addToolBar]; isDatePicker = YES; parent = parentView; } return self; } 

En la barra de herramientas, tengo dos botones Listo y Cancelar en Listo, envio una llamada por delegado con la date seleccionada y en cancelar, rechazo. Este código es para iOS 7 y iOS 8

Una forma limpia de hacerlo en Swift 2:

 let vc = UIAlertController(title: "Pickup time", message: nil, prefernetworkingStyle: .Alert) vc.addTextFieldWithConfigurationHandler({ (textfield) -> Void in let datepicker = UIDatePicker() // add delegate ... here textfield.inputView = datepicker }) vc.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) vc.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) presentViewController(vc, animated: true, completion: nil)