2009-10-26 13 views
5

Come posso implementare un selettore di data modale?iphone SDK: come implementare un selettore di data modale?

Quello che voglio succedere è quando l'utente entra in un campo di testo, viene creata una nuova vista che ha il selettore di data su di esso. Da lì, l'utente può interagire e selezionare una data. Quando la vista è chiusa, dovrebbe in qualche modo restituire la data al suo chiamante. È possibile?

BTW, non riesco a mettere il selettore di data sul mio modulo principale a causa dello spazio.

Grazie in anticipo.

risposta

12

Utilizzare un delegato!

Intestazione:

@class DatePickerController; 
@protocol DatePickerControllerDelegate 
- (void) datePickerController:(DatePickerController *)controller didPickDate:(NSDate *)date; 
@end 

@interface DatePickerController : UIViewController { 
    UIDatePicker *datePicker; 
    NSObject <DatePickerControllerDelegate> *delegate; 
} 

@property (nonatomic, retain) UIDatePicker *datePicker; 
@property (nonatomic, assign) NSObject <DatePickerControllerDelegate> *delegate; 
@end 

classe:

@implementation DatePickerController 
- (void) loadView { 
    self.view = [[[UIView alloc] init] autorelease]; 
    self.datePicker = [[[UIDatePicker alloc] init] autorelease]; 
    [self.view addSubview:self.datePicker]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [button setTitle:@"Done" forState:UIControlStateNormal]; 
    button.center = CGPointMake(160,240); 
    [button addTarget:self action:@selector(done) forControlEvents:(UIControlEventTouchUpInside)]; 
    [self.view addSubview:button]; 
} 

- (void) done { 
    [delegate datePickerController:self didPickDate:datePicker.date]; 
} 

- (void) dealloc { 
    [datePicker release]; 
    [super dealloc]; 
} 

@end 

tutte quelle stronzate in loadview può essere sostituito con un pennino, se si preferisce. Assicurati di dichiarare datePicker come IBOutlet. E quando si desidera utilizzare effettivamente è:

- (void) pickDate { 
    DatePickerController *screen = [[[DatePickerController alloc] init] autorelease]; 
    screen.delegate = self; 
    [self presentModalViewController:screen animated:YES]; 
} 

- (void) datePickerController:(DatePickerController *)controller didPickDate:(NSDate *)date { 
    [self doSomethingWithDate:date]; 
    [controller dismissModalViewControllerAnimated:YES]; 
} 
+0

Ottima risposta, Ed! – typeoneerror

+0

Ciao Ed, un po 'un principiante qui, potresti fornire una demo funzionante? Pensa mi manchi qualcosa! – jimbo

+0

Certo ... cosa c'è di sbagliato nel codice sopra? Non funziona? Dovrebbe. –

2

soluzione di lavoro più semplice:

Nel vostro .h:

@property (nonatomic,strong) IBOutlet UIDatePicker *datePicker; 
@property (weak, nonatomic) IBOutlet UITextField *historyDateSelect; 
@property (nonatomic, retain) UIToolbar *dateToolbar; 

Nel vostro .m:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    self.datePicker = [[UIDatePicker alloc]init]; 
    [self.datePicker addTarget:self action:@selector(dateChanged) forControlEvents:UIControlEventValueChanged]; 


    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:nil action:nil];  
    [toolbar setItems:[NSArray arrayWithObject:doneButton]]; 

    self.dateToolbar = toolbar; 

    self.historyDateSelect.inputView = self.datePicker; 
    self.historyDateSelect.inputAccessoryView = self.dateToolbar; 
} 

E questo è tutto. (L'ho provato localmente e funziona)

+0

Ottima soluzione. – GuybrushThreepwood

Problemi correlati