2012-08-16 13 views
5

Ho raggiunto per mostrare il datepicker all'interno del popover, farlo a livello di codice come viene mostrato in UIDatePicker in UIPopover.Come posso mostrare un UIDatePicker all'interno di un Popover su iPad usando StoryBoard?

Ma ho cercato di farlo in Interface Builder, ho già fatto un nome View Controller DatePickerViewController.m con un DatePicker in essa e il suo corrispondente IBoulet

#import <UIKit/UIKit.h> 

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

@end 

DatePicker inside DatePickerViewController.m in StoryBoard

Poi ho bisogno questo viene mostrato in un popover quando il campo di testo Compleanno è in fase di modifica. per cui uso il seguente codice

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

} 

E ho anche importare il costume DatePickerViewController nel mio attuale ViewController

#import "DatePickerViewController.h" 

Ma non sta mostrando il DatePicker all'interno del popover.

enter image description here

Qualcuno sa cosa potrebbe accadere?

+0

Si prega di controllare la mia risposta https://stackoverflow.com/a/7343106/815179 – Narayana

risposta

6

Risolto

Tutto quello che devo fare è creare un'istanza della Data StoryBoard Picker View Controller come:

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

in cui l'identificatore si trova in StoryBoard Attributi

Where to set the View controller Identifier

e ora viene mostrato

DatePicker from DatePickerViewController is now showed

+0

Sto provando a fare esattamente la stessa cosa. Come hai ottenuto che ViewController avesse le stesse dimensioni di DatePicker? Ho un enorme VC di dimensioni iPad con un DatePicker in fondo. Ho la stessa gerarchia di te: VC> Visualizza> Picker ma è enorme. E, come te, non si presenta. –

+0

Ho scoperto [qui] (http://stackoverflow.com/questions/9728952/resize-of-uiviewcontroller-in-storyboard). Hai bisogno di ridimensionare le cose in Size Inspector. –

+0

Questo è corretto! –

13

Si potrebbe voler evitare di tutto il lavoro nello storyboard creando il ViewController e DatePicker di programmazione:

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

e quindi utilizzare il metodo delegato per ottenere la data:

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

questo è buono se non si vuole usare lo storyboard – giuseppe

+0

Questa è una buona risposta se si vuole farlo per codice, ma il problema era come fare se stai usando Storyboard. –