2012-08-16 19 views
5

Osiągnąłem, aby pokazać datepicker wewnątrz popover, robiąc to programowo, jak to pokazano w UIDatePicker in UIPopover.Jak mogę wyświetlić UIDatePicker wewnątrz Popover na iPadzie przy użyciu StoryBoard?

Ale ja staram się to zrobić w interfejsie Builder, już popełnił View Controller nazwie DatePickerViewController.m z DatePicker w nim i jego odpowiedniego IBoulet

#import <UIKit/UIKit.h> 

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

@end 

DatePicker inside DatePickerViewController.m in StoryBoard

Wtedy muszę zostanie to pokazane w okienku popover, gdy edytowane jest pole tekstowe Urodziny. więc używam następujący kod

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

} 

I ja również zaimportować niestandardową DatePickerViewController w moim obecnym ViewController

#import "DatePickerViewController.h" 

Ale to nie jest wyświetlana datepicker wewnątrz popover.

enter image description here

Czy ktoś wie, co może się dziać?

+0

Proszę sprawdzić moją odpowiedź https://stackoverflow.com/a/7343106/815179 – Narayana

Odpowiedz

6

rozwiązać

Wszystko co musisz zrobić, to instancję Storyboard Data Picker View Controller jak:

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

gdzie identyfikator jest ustawiony w storyboard Atrybuty Inspector

Where to set the View controller Identifier

i teraz jest pokazane

DatePicker from DatePickerViewController is now showed

+0

Próbuję zrobić dokładnie to samo. Jak sprawiłeś, że ViewController ma taki sam rozmiar jak DatePicker? Mam ogromny rozmiar VC na iPada z datownikiem na dole. Mam taką samą hierarchię jak ty: VC> Widok> Picker, ale jego ogromna. I tak jak ty, to się nie pojawia. –

+0

Dowiedziałem się [tutaj] (http://stackoverflow.com/questions/9728952/resize-of-uiviewcontroller-in-storyboard). Musisz zmienić rozmiar w Inspektorze rozmiarów. –

+0

Zgadza się! –

13

Możesz chcieć uniknąć całą pracę w serii ujęć, poprzez stworzenie ViewController i datepicker programowo:

//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; 

a następnie użyć metody delegata, aby uzyskać datę:

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

jest to dobre, jeśli nie chcesz używać scenorysu – giuseppe

+0

To jest dobra odpowiedź, jeśli chcesz zrobić to za pomocą kodu, ale problem polegał na tym, jak to zrobić jeśli używasz Storyboard. –

Powiązane problemy