Вопрос по uidatepicker, uitextfielddelegate, ios, ipad, popover – Как я могу показать UIDatePicker внутри Popover на iPad с помощью StoryBoard?

5

Я добился того, чтобы показать средство выбора даты внутри поповера, делая это программно, как показано вUIDatePicker в UIPopover.

Но я пытался сделать это в интерфейсе Builder, я уже сделал View Controller с именем DatePickerViewController.m с DatePicker в нем и его соответствующим IBoulet

#import <UIKit/UIKit.h>

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

@end

DatePicker inside DatePickerViewController.m in StoryBoard

Затем мне нужно, чтобы это отображалось во всплывающем окне при редактировании текстового поля «День рождения». поэтому я использую следующий код

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

}

И я также импортирую пользовательский DatePickerViewController в мой текущий ViewController

#import "DatePickerViewController.h"

Но это не показывает DatePicker внутри поповера.

enter image description here

Кто-нибудь знает, что может происходить?

Пожалуйста, проверьте мой ответstackoverflow.com/a/7343106/815179 Narayana

Ваш Ответ

2   ответа
6

Все, что мне нужно сделать, это создать экземпляр StoryBoard Date Picker View Controller, например:

...
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

Where to set the View controller Identifier

и теперь это показано

DatePicker from DatePickerViewController is now showed

Используйте событие onValueChange (я думаю, как это называется) DatePicker David Cespedes
@DavidCespedes как узнать, когда пользователь выбирает свою дату?
я узналhere, Вам нужно изменить размер вещей в инспекторе размера.
Я пытаюсь сделать то же самое. Как вы получили ViewController такого же размера, как DatePicker? У меня есть массивный VC размером с iPad с DatePicker внизу. У меня та же иерархия, что и у вас: VC & gt; Просмотр & gt; Сборщик, но массивный. И, как и вы, он не появляется.
Это правильно! David Cespedes
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;

А затем используйте метод делегата, чтобы получить дату:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    self.startDate = self.datePicker.date;
}
это хорошо, если не хочешь использовать раскадровку
Это хороший ответ, если вы хотите сделать это с помощью кода, но проблема заключалась в том, как это сделать, если вы используете раскадровки. David Cespedes

Похожие вопросы