ios UIPopover 中的 UIDatePicker
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7341835/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
UIDatePicker in UIPopover
提问by Prajoth
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 have tried creating a viewcontroller, placing the datepicker in the view controller and then:
我在整个互联网上搜索过(也许我有点夸大了)关于如何将 DatePicker 放入 UIPopover 并在 iPad 应用程序中显示的教程。我尝试创建一个视图控制器,将日期选择器放在视图控制器中,然后:
self.popover = [[UIPopoverController alloc] initWithContentViewController:sa];
self.popover = [[UIPopoverController alloc] initWithContentViewController:sa];
(sa is the name of the viewcontroller i created), but this doesn't work, and the app crashes. Can anyone help?
(sa 是我创建的视图控制器的名称),但这不起作用,应用程序崩溃。任何人都可以帮忙吗?
回答by Narayana
Try with below code. It will work fine:
试试下面的代码。它会正常工作:
Objective-C
目标-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
斯威夫特 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
如果您在视图控制器中分别实现以下委托,则相同的代码也适用于 iPhone
extension YourViewController : UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
// Force popover style
return UIModalPresentationStyle.none
}
}
回答by Suresh Varma
Now since you have tagged iPhoneIt can clearly be assumed that you are trying to use UIPopoverControllerin iPhoneBut UIPopoverControlleris available only for iPad. So it is resulting in a crash since iPhone doesn't recognize that controller.
现在,既然你已经标记的iPhone可以清楚地假定您要使用UIPopoverController的iPhone,但UIPopoverController仅仅是可用iPad。因此它导致崩溃,因为 iPhone 无法识别该控制器。

