[英]How to add UIDatePicker in UIAlertController in iOS8?
I am working on a project which I had already released with iOS-7.我正在开发一个我已经用 iOS-7 发布的项目。 But now as the action sheet is making problem so I am now implementing UIAlertController.
但是现在由于操作表出现问题,所以我现在正在实施 UIAlertController。 Following is the code which I am using for showing UIAlertController with UIPicker.
以下是我使用 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];
But I am not able to add datepicker in it.但我无法在其中添加日期选择器。 It is not working same as normal picker and the app hang.
它与普通选择器和应用程序挂起的工作方式不同。 Please advice for any sample code for adding UIDatePicker in UIAlertController.
请为在 UIAlertController 中添加 UIDatePicker 的任何示例代码提供建议。 Thanks in advance
提前致谢
Adding UIDatePicker to action sheet was discouraged by Apple all along. Apple 一直不鼓励将 UIDatePicker 添加到操作表。 Since iOS 7, Apple had introduced the use of inline date picker (see how it is done in the Calendar app).
从 iOS 7 开始,Apple 引入了内联日期选择器的使用(查看它是如何在日历应用程序中完成的)。
If you managed to hack a workaround using UIAlertController, it may probably break again in future iOS releases.如果您设法使用 UIAlertController 破解了一个解决方法,它可能会在未来的 iOS 版本中再次中断。
For iOS9+ Swift code here.对于 iOS9+ Swift 代码在这里。
add target to your date button or other view.将目标添加到您的日期按钮或其他视图。
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)
}
this works for me这对我有用
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];
A clean way to do it in Swift 2:在 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)
@idris code in swift3 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)
}
Here is my code that is tested on both iOS 7 and iOS 8这是我在 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;
}
On Tool bar I have two buttons Done and Cancel On Done i send back a call via delegate with selected date and on cancel I dismiss.在工具栏上,我有两个按钮 Done 和 Cancel On Done 我通过指定日期的代表发回一个电话,取消时我关闭。 This code is for both iOS 7 and iOS 8
此代码适用于 iOS 7 和 iOS 8
It can be done with a few hacks.它可以通过一些技巧来完成。 Here's what I've used so far with very little maintenance.
这是我迄今为止使用的很少维护的东西。
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .actionSheet)
let picker = UIDatePicker()
picker.translatesAutoresizingMaskIntoConstraints = false
alertController.view.addSubview(picker)
alertController.view.heightAnchor.constraint(equalToConstant: 350).isActive = true
picker.leadingAnchor.constraint(equalTo: alertController.view.leadingAnchor).isActive = true
picker.trailingAnchor.constraint(equalTo: alertController.view.trailingAnchor).isActive = true
picker.topAnchor.constraint(equalTo: alertController.view.topAnchor, constant: 10).isActive = true
/// Add your actions here....
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.