UIDatePicker in UIPopover

后端 未结 2 1984
时光取名叫无心
时光取名叫无心 2020-11-29 04:39

I have searched the entire internet (maybe I am exaggerating a little) for a tutorial on how to put a DatePicker into a UIPopover and display that in an iPad application. I

相关标签:
2条回答
  • 2020-11-29 05:29

    Try with below code. It will work fine:

    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)")
        }
    

    Same code will work iPhone also if you implement below delegate respective in view controller

    extension YourViewController : UIPopoverPresentationControllerDelegate {
        func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
            // Force popover style
            return UIModalPresentationStyle.none
        }
    }
    
    0 讨论(0)
  • 2020-11-29 05:31

    Now since you have tagged iPhone It can clearly be assumed that you are trying to use UIPopoverController in iPhone But UIPopoverController is available only for iPad. So it is resulting in a crash since iPhone doesn't recognize that controller.

    0 讨论(0)
提交回复
热议问题