Dav*_*des 5 uidatepicker popover ipad ios uitextfielddelegate
我已经实现了在popover中显示日期选择器,以编程方式执行,因为它在UIPopover中的UIDatePicker中显示.
但我一直在尝试在界面生成器中完成它,我已经创建了一个名为DatePickerViewController.m的视图控制器,其中包含一个DatePicker及其相应的IBoulet
#import <UIKit/UIKit.h>
@interface DatePickerViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIDatePicker *birthdayDatePicker;
@end
Run Code Online (Sandbox Code Playgroud)

然后,当编辑生日文本字段时,我需要在弹出框中显示它.所以我使用以下代码
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
//Assign DatePicker to Birthday TextField
//build our custom popover view
DatePickerViewController* popoverContent = [[DatePickerViewController alloc] init];
//resize the popover view shown
//in the current view to the view's size
popoverContent.contentSizeForViewInPopover = CGSizeMake(320, 216);
// dismiss existing popover
if (self.popoverControllerBirthday)
{
[self.popoverControllerBirthday dismissPopoverAnimated:NO];
self.popoverControllerBirthday = nil;
}
//create a popover controller with my DatePickerViewController in it
UIPopoverController *popoverControllerForDate = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
//Set the delegate to self to receive the data of the Datepicker in the popover
popoverControllerForDate.delegate = self;
//Adjust the popover Frame to appear where I want
CGRect myFrame =textField.frame;
myFrame.origin.x = 260;
myFrame.origin.y = 320;
//Present the popover
[popoverControllerForDate presentPopoverFromRect:myFrame
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionDown
animated:YES];
self.popoverControllerBirthday = popoverControllerForDate;
return NO; // tells the textfield not to start its own editing process (ie show the keyboard)
}
Run Code Online (Sandbox Code Playgroud)
我还在当前的ViewController中导入自定义DatePickerViewController
#import "DatePickerViewController.h"
Run Code Online (Sandbox Code Playgroud)
但它并没有在popover中显示datepicker.

有人知道会发生什么吗?
小智 13
您可能希望通过以编程方式创建ViewController和DatePicker来避免故事板中的所有工作:
//build our custom popover view
UIView *v = [[UIView alloc] init];
CGRect pickerFrame = CGRectMake(0, 0, 320, 216);
UIDatePicker *pView=[[UIDatePicker alloc] initWithFrame:pickerFrame];
pView.datePickerMode = UIDatePickerModeDate;
self.datePicker = pView;
[v addSubview:self.datePicker];
UIViewController *popoverContent = [[UIViewController alloc]init];
popoverContent.view = v;
//resize the popover view shown
//in the current view to the view's size
popoverContent.contentSizeForViewInPopover = CGSizeMake(320, 216);
// dismiss existing popover
if (self.pcDatePicker)
{
[self.pcDatePicker dismissPopoverAnimated:NO];
self.pcDatePicker = nil;
}
//create a popover controller with my DatePickerViewController in it
UIPopoverController *popoverControllerForDate = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
//Set the delegate to self to receive the data of the Datepicker in the popover
popoverControllerForDate.delegate = self;
//Adjust the popover Frame to appear where I want
CGRect myFrame = sender.frame;//CGRectMake(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, 320, 200);
myFrame.origin.x = 260;
myFrame.origin.y = 320;
//Present the popover
[popoverControllerForDate presentPopoverFromRect:myFrame
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
self.pcDatePicker = popoverControllerForDate;
Run Code Online (Sandbox Code Playgroud)
然后使用委托方法获取日期:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
self.startDate = self.datePicker.date;
}
Run Code Online (Sandbox Code Playgroud)
解决了
我所要做的就是实例化StoryBoard日期选择器视图控制器,如:
...
DatePickerViewController* popoverContent = [[DatePickerViewController alloc] init];
popoverContent =[[UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil]
instantiateViewControllerWithIdentifier:@"DatePickerVC"];
//resize the popover view shown
//in the current view to the view's size
popoverContent.contentSizeForViewInPopover = CGSizeMake(320, 216);
...
Run Code Online (Sandbox Code Playgroud)
其中标识符在StoryBoard Attributes Inspector中设置

现在它显示了
