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 UIPopoverController
in iPhone
But UIPopoverController
is available only for iPad
. So it is resulting in a crash since iPhone doesn't recognize that controller.
现在,既然你已经标记的iPhone可以清楚地假定您要使用UIPopoverController
的iPhone
,但UIPopoverController
仅仅是可用iPad
。因此它导致崩溃,因为 iPhone 无法识别该控制器。