2015-03-12 3 views
1

Je crée une vue sélecteur qui s'affiche lorsque l'utilisateur appuie sur un champ de texte. Cela fonctionne très bien. Mais je veux ignorer la vue du sélecteur lorsque l'utilisateur appuie sur le bouton Terminé. Ceci est mon code à ce jour:Quitter UIPickerView lorsque vous appuyez sur le bouton Terminé

- (void)showPickerWithDoneButton:(UITextField *)sender 
{ 
    UITextField *textField = sender; 

    // Creamos UIPickerView como una vista personalizada de un keyboard View 
    UIPickerView *pickerView = [[UIPickerView alloc] init]; 
    [pickerView sizeToFit]; 
    pickerView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    pickerView.delegate = self; 
    pickerView.dataSource = self; 
    pickerView.showsSelectionIndicator = YES; 

    //UIPickerView 

    //Asignamos el pickerview al inputView de nuestro texfield 
    self.tipos_auto.inputView = pickerView; 

    // Preparamos el botón 
    UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init]; 
    keyboardDoneButtonView.barStyle = UIBarStyleDefault; 
    keyboardDoneButtonView.translucent = YES; 
    keyboardDoneButtonView.tintColor = nil; 
    [keyboardDoneButtonView sizeToFit]; 

    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:   NSLocalizedString(@"Aceptar", @"Button")                     style:UIBarButtonItemStyleBordered target:self                 action:@selector(pickerHechoClicked:)]; 

    doneButton.tintColor = [UIColor blackColor]; 

    //Para ponerlo a la derecha del todo voy a crear un botón de tipo Fixed Space 
    UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace                     target:nil action:nil]; 

    fixedSpace.width = keyboardDoneButtonView.frame.size.width - 150; 
    [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:fixedSpace, doneButton, nil]]; 

    // Finalmente colocamos la keyboardDoneButtonView en el text field... 
    textField.inputAccessoryView = keyboardDoneButtonView; 
} 

Et ceci est la méthode qui devrait rejeter le point de vue du sélecteur:

-(void) pickerHechoClicked :(id)sender{ 
    [sender resignFirstResponder]; 
} 

Mais après avoir tapé sur le bouton des application se bloque avec l'erreur suivante:

** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIBarButtonItem resignFirstResponder]: unrecognized selector sent to instance 

Toute aide est la bienvenue.

Répondre

4

La chose la plus facile à faire est de demander à la vue de finaliser toutes les opérations d'édition, car il n'a pas d'importance ce que le premier courant répondeur est en fait (tant que c'est un sous-vue quelque part):

[self.view endEditing:YES]; 
+0

Joli conseil, merci. Ca marche bien – user4619034

+0

Ah, je ne connais pas cette fonction de UIView. Agréable! –

2

Il semble que vous transmettiez à UIBarButtonItem la méthode "pickerHechoClicked" au lieu d'envoyer votre instance de UIPickerView.

Lorsque le bouton done est enfoncé, vous devez passer la variable pickerView comme paramètre à "pickerHechoClicked" à la place.

Je ne vois pas le code où vous attribuez réellement votre bouton fait sur commande une action, mais dans le code pour gérer l'utilisation de la presse bouton ceci:

[self pickerHechoClicked:pickerView]; 
+0

Merci. Mais je suis sûr que la réponse de Wain est la meilleure solution. – user4619034

0

Vous ne pouvez pas appeler resignFirstResponder sur votre UIBarButtonItem mais votre préparateur. Donc, la solution simple est de garder une référence de votre sélecteur puis appelez [self.myPicker resignFirstResponder]