UIPopover 中的 UIDatePicker

Posted

技术标签:

【中文标题】UIPopover 中的 UIDatePicker【英文标题】:UIDatePicker in UIPopover 【发布时间】:2011-11-12 14:22:46 【问题描述】:

我已经搜索了整个互联网(也许我有点夸大其词),以获取有关如何将 DatePicker 放入 UIPopover 并在 iPad 应用程序中显示的教程。我尝试创建一个视图控制器,将日期选择器放在视图控制器中,然后:

self.popover = [[UIPopoverController alloc] initWithContentViewController:sa];

(sa 是我创建的视图控制器的名称),但这不起作用,应用程序崩溃。有人可以帮忙吗?

【问题讨论】:

如果您可以发布不起作用的代码,那将会很有帮助。换句话说,你尝试过什么? 并发布应用程序崩溃时控制台显示的内容 "无法识别的选择器发送到实例 0x583b2d0" 【参考方案1】:

试试下面的代码。它会正常工作:

Objective-C

- (IBAction)showDatePicker:(UIButton *)sender 
    UIDatePicker *datePicker = [[UIDatePicker alloc]init];//Date picker
    datePicker.frame = CGRectMake(0, 0, 320, 216);
    datePicker.datePickerMode = UIDatePickerModeDateAndTime;
    [datePicker setMinuteInterval:5];
    [datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged];//need to implement this method in same class


    UIView *popoverView = [[UIView alloc] init];   //view
    popoverView.backgroundColor = [UIColor clearColor];
    [popoverView addSubview:datePicker];
    // here you can add tool bar with done and cancel buttons if required

    UIViewController *popoverViewController = [[UIViewController alloc] init];
    popoverViewController.view = datePicker;
    popoverViewController.view.frame = CGRectMake(0, 0, 320, 216);
    popoverViewController.modalPresentationStyle = UIModalPresentationPopover;
    popoverViewController.preferredContentSize = CGSizeMake(320, 216);
    popoverViewController.popoverPresentationController.sourceView = sender; // source button
    popoverViewController.popoverPresentationController.sourceRect = sender.bounds; // source button bounds
    //popoverViewController.popoverPresentationController.delegate = self;
    [self presentViewController:popoverViewController animated:YES completion:nil];

- (void)dateChanged:(UIDatePicker *)datePicker 
    NSLog(@"DATE :: %@", datePicker.date);

Swift 4.2

 @IBAction func showDatePicker(_ sender: UIButton) 
    let datePicker = UIDatePicker()//Date picker
    let datePickerSize = CGSize(width: 320, height: 216) //Date picker size
    datePicker.frame = CGRect(x: 0, y: 0, width: datePickerSize.width, height: datePickerSize.height)
    datePicker.datePickerMode = .dateAndTime
    datePicker.minuteInterval = 5
    datePicker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)

    let popoverView = UIView()
    popoverView.backgroundColor = UIColor.clear
    popoverView.addSubview(datePicker)
    // here you can add tool bar with done and cancel buttons if required

    let popoverViewController = UIViewController()
    popoverViewController.view = popoverView
    popoverViewController.view.frame = CGRect(x: 0, y: 0, width: datePickerSize.width, height: datePickerSize.height)
    popoverViewController.modalPresentationStyle = .popover
    popoverViewController.preferredContentSize = datePickerSize
    popoverViewController.popoverPresentationController?.sourceView = sender // source button
    popoverViewController.popoverPresentationController?.sourceRect = sender.bounds // source button bounds
    popoverViewController.popoverPresentationController?.delegate = self // to handle popover delegate methods 
    self.present(popoverViewController, animated: true, completion: nil)

    
    @objc func dateChanged(_ datePicker: UIDatePicker) 
        print("DATE :: \(datePicker.date)")
    

如果您在视图控制器中分别实现以下委托,则相同的代码也适用于 iPhone

extension YourViewController : UIPopoverPresentationControllerDelegate 
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle 
        // Force popover style
        return UIModalPresentationStyle.none
    

【讨论】:

在结果方法中,您可以使用 datepicker.date 获取日期 抱歉这个菜鸟问题,但是如何在没有委托方法的情况下设置“结果”方法?到目前为止,我只从现有的视图控制器创建了 UIPopovers,所以我设置了一个委托方法来传递数据。但是如何使用 selector(Result) 方法提取数据?感谢您的帮助! 谢谢!效果很好,正是我想要的。 @Prajoth 您不需要为日期选择器设置委托。如果您使用 [datePicker addTarget...] 来查看线路调用;结果是视图控制器本身具有的 IBAction。 这很棒,纳拉亚纳。刚刚在 iPad 上的 Xcode 9 中进行了测试。【参考方案2】:

现在既然你已经标记了iPhone,可以清楚地假设你正在尝试在iPhone 中使用UIPopoverController,但UIPopoverController 仅适用于iPad。因此,由于 iPhone 无法识别该控制器,因此导致崩溃。

【讨论】:

OP 最初标记了 iPhone,但是他的问题是 iPad,并且已经接受了一个答案(正如你提到的)只能在 iPad 上运行。我已将此问题重新标记为 iPad,以避免进一步混淆 进一步阅读“UIPopoverController仅适用于iPad”:marksands.github.io/2014/05/27/how-apple-cheats.html

以上是关于UIPopover 中的 UIDatePicker的主要内容,如果未能解决你的问题,请参考以下文章

点击 UITextField iPad 后 UIPopover 中的 datePicker

启动时如何将数据从 uiviewcontroller 发送到 uipopover?

如何将 UIPopover 附加到以编程方式创建的 CGRect

UIPopover 中的空表视图

UIPopover 中的导航栏

单击 UIActionSheet 中的按钮启动 UIPopover