2009-10-26 10 views
5

¿Cómo puedo implementar un selector de fecha modal?iPhone SDK: ¿Cómo implementar un selector de fecha modal?

Lo que quiero que suceda es que cuando el usuario ingresa un campo de texto, se crea una nueva vista que tiene el selector de fecha en él. A partir de ahí, el usuario puede interactuar y seleccionar una fecha. Cuando la vista está cerrada, de alguna manera debe devolver la fecha a la persona que llama. es posible?

Por cierto, no puedo poner el selector de fecha en mi formulario principal debido al espacio.

Gracias de antemano.

Respuesta

12

¡Utilice un delegado!

Cabecera:

@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 

clase:

@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 

toda esa basura en loadView se puede reemplazar con una punta, si lo prefiere. Solo asegúrate de declarar datePicker como IBOutlet. Y cuando se quiere hacer uso de ella:

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

¡Gran respuesta, Ed! – typeoneerror

+0

Hola Ed, un poco novato aquí, ¿podrías proporcionar una demostración funcional? ¡Creo que me estoy perdiendo algo! – jimbo

+0

Claro ... ¿qué pasa con el código de arriba? ¿No está funcionando? Debería. –

2

más simple solución de trabajo:

En su .h:

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

En su .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; 
} 

Y Eso es. (Lo probé localmente y funciona)

+0

Gran solución. – GuybrushThreepwood

Cuestiones relacionadas