【问题标题】:How can I show a UIDatePicker inside a Popover on iPad using StoryBoard?如何使用 StoryBoard 在 iPad 上的 Popover 中显示 UIDatePicker?
【发布时间】:2012-08-16 18:16:02
【问题描述】:

我已经实现在弹出框内显示日期选择器,以编程方式进行,如UIDatePicker in UIPopover 所示。

但我一直在尝试在界面生成器中执行此操作,我已经创建了一个名为 DatePickerViewController.m 的视图控制器,其中包含一个 DatePicker 及其对应的 IBoulet

#import <UIKit/UIKit.h>

@interface DatePickerViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIDatePicker *birthdayDatePicker;

@end

然后我需要在编辑生日文本字段时将其显示在弹出窗口中。所以我使用以下代码

- (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)

}

我还在我当前的 ViewController 中导入了自定义 DatePickerViewController

#import "DatePickerViewController.h"

但它没有显示弹出框内的日期选择器。

有人知道会发生什么吗?

【问题讨论】:

标签: ios ipad uidatepicker popover uitextfielddelegate


【解决方案1】:

您可能希望通过以编程方式创建 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;

然后使用委托方法获取日期:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    self.startDate = self.datePicker.date;
}

【讨论】:

  • 如果您想通过代码执行此操作,这是一个很好的答案,但如果您使用 Storyboard,问题是如何执行此操作。
【解决方案2】:

解决了

我所要做的就是实例化 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);
...

在 StoryBoard Attributes Inspector 中设置标识符的位置

现在显示出来了

【讨论】:

  • 我正在尝试做同样的事情。你是如何让 ViewController 和 DatePicker 一样大小的?我有一个巨大的 iPad 大小的 VC,底部有一个 DatePicker。我和你有同样的层次结构:VC > View > Picker 但它很大。而且,和你一样,它没有出现。
  • 我发现here。您需要在 Size Inspector 中调整大小。
  • @DavidCespedes 你如何识别用户选择他的日期?
  • 使用 Datepicker 的 onValueChange 事件(我认为是这样的)
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2014-01-11
  • 2019-07-09
相关资源
最近更新 更多