如何在iOS8中的UIAlertController中添加UIDatePicker?
我正在开发一个我已经用iOS-7发布的项目。 但是现在因为操作表出现问题所以我现在正在实现UIAlertController。 以下是我用来显示带有UIPicker的UIAlertController的代码。
alertController = [UIAlertController alertControllerWithTitle:@"" message:@"" preferredStyle: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];
但是我无法在其中添加datepicker。 它与普通选择器不同,应用程序挂起。 请提供有关在UIAlertController中添加UIDatePicker的示例代码的建议。 提前致谢
Apple一直不鼓励将UIDatePicker添加到操作表中。 自iOS 7以来,Apple已经引入了内联日期选择器的使用(请参阅在日历应用程序中完成的操作)。
如果您设法使用UIAlertController破解解决方法,它可能会在未来的iOS版本中再次破解。
这对我有用
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n" message:nil preferredStyle: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];
对于iOS9 + Swift代码,请点击此处。
将目标添加到日期按钮或其他视图。
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:" " , preferredStyle: 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) }
这是我在iOS 7和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 preferredStyle: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; }
在工具栏上我有两个按钮完成和取消完成我通过委托发回一个选定日期的电话和取消我解雇。 此代码适用于iOS 7和iOS 8
swift3中的@idris代码
//Function Start func dateSelect() { //init date picker let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 260)) datePicker.datePickerMode = UIDatePickerMode.date //add target datePicker.addTarget(self, action: #selector(dateSelected(datePicker:)), for: UIControlEvents.valueChanged) //add to actionsheetview let alertController = UIAlertController(title: "Date Selection", message:" " , preferredStyle: UIAlertControllerStyle.actionSheet) alertController.view.addSubview(datePicker)//add subview let cancelAction = UIAlertAction(title: "Done", style: .cancel) { (action) in self.dateSelected(datePicker: datePicker) } //add button to action sheet alertController.addAction(cancelAction) let height:NSLayoutConstraint = NSLayoutConstraint(item: alertController.view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 300) alertController.view.addConstraint(height); self.present(alertController, animated: true, completion: nil) } //selected date func @objc func dateSelected(datePicker:UIDatePicker) { let dateFormatter = DateFormatter() dateFormatter.dateStyle = DateFormatter.Style.short let currentDate = datePicker.date print(currentDate) }
一个干净的方式在Swift 2中做到这一点:
let vc = UIAlertController(title: "Pickup time", message: nil, preferredStyle: .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)