简体   繁体   English

如何在 iOS8 的 UIAlertController 中添加 UIDatePicker?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM