2012-08-16 9 views
5

Ich habe erreicht, den Datepicker innerhalb des Popover zu zeigen, programmatisch zu tun, wie es in UIDatePicker in UIPopover gezeigt wird.Wie kann ich einen UIDatePicker in einem Popover auf dem iPad mit StoryBoard anzeigen?

Aber ich habe versucht, es in Interface Builder zu tun, habe ich bereits einen View-Controller namens DatePickerViewController.m mit einem Datepicker in sie und ihre entsprechenden IBoulet

#import <UIKit/UIKit.h> 

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

@end 

DatePicker inside DatePickerViewController.m in StoryBoard

Dann brauche ich Dies wird in einem Popover angezeigt, wenn das Textfeld Geburtstag bearbeitet wird. so verwende ich den folgenden Code

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

} 

Und ich importiere auch die benutzerdefinierten DatePickerViewController in meinem aktuellen Viewcontroller

#import "DatePickerViewController.h" 

Aber es zeigt nicht die picker im Innern des popover.

enter image description here

Weiß jemand, was passiert sein könnte?

+0

Bitte überprüfen Sie meine Antwort https://StackOverflow.com/a/7343106/815179 – Narayana

Antwort

6

Gelöst

Alles, was ich tun muß, ist das Storyboard Date Picker-View-Controller instanziiert wie:

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

wo die Kennung in der Storyboard gesetzt Inspector Attribute

Where to set the View controller Identifier

und Jetzt wird es angezeigt

DatePicker from DatePickerViewController is now showed

+0

Ich versuche genau dasselbe zu tun. Wie haben Sie den ViewController auf die gleiche Größe gebracht wie der DatePicker? Ich habe eine riesige iPad Größe VC mit einem DatePicker an der Unterseite. Ich habe die gleiche Hierarchie wie Sie: VC> View> Picker aber seine massive. Und wie du, es wird nicht angezeigt. –

+0

Ich fand [hier] (http://stackoverflow.com/questions/9728952/resize-of-uiviewcontroller-in-storyboard). Sie müssen die Größe im Größeninspektor ändern. –

+0

Das stimmt! –

13

Sie könnten die ganze Arbeit im Storyboard vermeiden wollen, indem Sie die Viewcontroller zu schaffen und die Datepicker programmatisch:

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

Und dann die Delegaten-Methode verwenden, um das Datum zu erhalten:

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

das ist gut, wenn man nicht Storyboard verwenden möchte – giuseppe

+0

Dies ist eine gute Antwort, wenn Sie es durch Code tun möchten, aber das Problem war, wie zu tun Wenn Sie Storyboards verwenden. –