2009-10-26 6 views
5

Comment puis-je implémenter un sélecteur de date modale? Ce que je veux arriver, c'est que lorsque l'utilisateur entre dans un champ de texte, une nouvelle vue est créée avec le sélecteur de date dessus. De là, l'utilisateur peut interagir et sélectionner une date. Lorsque la vue est fermée, elle doit renvoyer la date à l'appelant. Est-ce possible?iphone SDK: Comment implémenter un sélecteur de date modal?

BTW, je ne peux pas mettre le sélecteur de date sur ma forme principale en raison de l'espace.

Merci d'avance.

Répondre

12

Utilisez un délégué!

tête:

@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 

Toutes ces conneries dans loadview peut être remplacé par un NIB si vous préférez. Assurez-vous simplement de déclarer datePicker comme un IBOutlet. Et quand vous voulez utiliser réellement:

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

Grande réponse, Ed! – typeoneerror

+0

Salut Ed, un peu un débutant ici, pourriez-vous fournir une démo de travail à tous? Je pense qu'il me manque quelque chose! – jimbo

+0

Bien sûr ... quel est le problème avec le code ci-dessus? Est-ce que ça ne marche pas? Cela devrait. –

2

solution de travail Simpler:

Dans votre .h:

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

Dans votre .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; 
} 

Et c'est tout. (Je l'ai testé localement et fonctionne)

+0

Excellente solution. – GuybrushThreepwood

Questions connexes