2012-06-16 12 views
6

Ho un controller di visualizzazione tabella con (tra gli altri) una cella che deve rappresentare una data. Ho seguito questo post "How do I make a modal date picker that only covers half the screen?" e lo faccio funzionare con una grande eccezione: non riesco a far scomparire il selettore!Sostituzione di UITextField input con UIDatePicker

Ho provato a registrare l'evento UIControlEventTouchUpOutside, ma sembra che questo non sia generato dal selettore (o almeno nella modalità in cui lo sto utilizzando).

Come posso riconoscere che l'utente ha finito di selezionare una data?

Inoltre, esiste un modo per disabilitare l'utente dall'immissione diretta in UITextField? Voglio costringerli a usare il raccoglitore. Ho visto questo post "Disable blinking cursor in UITextField?", ma c'è un altro modo?

reagards,

--John

risposta

12

provare questo codice .. qui sto mettendo un datepicker ad un UITextField .. si avrà un pulsante di fatto alla parte superiore della barra di navigazione a destra .. quindi facendo clic fatto che userò può ignorare il datepicker .. l'altro metodo migliore è mettendo una barra degli strumenti sopra il datepicker con il pulsante done .. Prova questo funzionerà .. quando cambi il datepicker puoi popolare il campo di testo .. Spero che questo aiuti ..

vedere questo link stackoverflow https://stackoverflow.com/a/4824319/763747 questo avrà il datario con done b utton come barra degli strumenti sopra il keybord ..

#pragma mark - 
#pragma mark - TextField Delegate 

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return TRUE; 
} 


- (void) textFieldDidBeginEditing:(UITextField *)textField { 
    itsRightBarButton.title = @"Done"; 
    itsRightBarButton.style = UIBarButtonItemStyleDone; 
    itsRightBarButton.target = self; 
    itsRightBarButton.action = @selector(doneAction:); 
    if ([textField isEqual:itsIncidentDateTextField]) 
    { 
     itsDatePicker = [[[UIDatePicker alloc] init] autorelease]; 
     itsDatePicker.datePickerMode = UIDatePickerModeDate; 
     [itsDatePicker addTarget:self action:@selector(incidentDateValueChanged:) forControlEvents:UIControlEventValueChanged]; 
     //datePicker.tag = indexPath.row; 
     textField.inputView = itsDatePicker; 
    } 
} 

- (IBAction) incidentDateValueChanged:(id)sender{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"MMM d, yyyy"]; 
    itsIncidentDateTextField.text = [dateFormatter stringFromDate:[itsDatePicker date]]; 
    [dateFormatter release]; 
} 
+0

vedo che è la tecnica utilizzata in Contatti, dire se si aggiunge un compleanno. Dovrò rielaborare la mia vista perché attualmente ho un pulsante "Annulla" come elemento del pulsante della barra destra. Lo proverò. Grazie per la risposta! – johnnyspo

+0

Anche io ho un pulsante di salvataggio .. puoi cambiare i pulsanti .. –

+0

Esattamente quello che ho fatto !! Grazie ancora. – johnnyspo

-2

Ho usato un metodo diverso per scomparire UIDatePicker.

creare un file XIB (NIB) e aggiungere ad esso un UIDatePicker poi ridimensionare la vista in modo che si adatta solo l'UIDatePicker, creare una proprietà (rendere più forte e nonatomic) nel vostro ViewController (o qualunque classe di vostro usando, e sintetizzare ovviamente).

@property (nonatomic, strong) UIView *myDatePickerView; 
@synthesize myDatePickerView; 

quindi creare un metodo loadDatePickerView

- (void) loadDatePickerView 
{ 
    UINib *nib = [UINib nibWithNibName:kNIBname bundle:[NSBundle mainBundle]]; 
    NSArray *views = [nib instantiateWithOwner:self options:nil]; 
    self.myDatePickerView = [views firstObject]; 
    [myDatePickerView setFrame:CGRectMake(0, 318, 320, 162)]; 
    [self.view addSubview:myDatePickerView]; 
} 

attuare l'UITextFieldDelegate, e nel metodo textFieldDidBeginEditing chiamare il metodo loadDatePickerView,

[self loadDatePickerView]; 

per rendere funzione creare una proprietà che è un'interfaccia utente DatePicker esempio

@property (nonatomic,strong) 

UIDatePicker *myDatePicker; 

(sintetizzare ovviamente)

ora creare un IBAction in questo modo:

-(IBAction)datePickerValueChanged:(UIDatePicker *)sender 
{ 
    myDatePicker = [[myDatePickerView subviews] lastObject]; 
    //now you can do whatever you want with the DatePicker 
} 

ora collegare l'IBAction al selettore nel file XIB, in questo modo il XIB ora è l'istanza UIDatePicker che hai creato nel VC, se vuoi che scompaia puoi aggiungere un UITapGestureRecognizer (nel ViewDidLoad) e la s elettore sarà un altro IBAction che rimuove myDatePickerView dalla sua Superview come questo:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(dropPicker:)]; 
    [self.view addGestureRecognizer:tap]; 
    [self datePickerValueChanged:myDatePicker]; 
} 

-(IBAction)dropPicker:(id)sender 
{ 
    [myDatePickerView removeFromSuperview]; 
} 
Problemi correlati