Question

J'ai un UITextField, et lorsque le texte est entré, je souhaite obtenir la valeur doubleValue à partir du champ de texte, effectuer des calculs et les afficher dans un UITableView.

Le délégué de UITextField adopte le protocole UITextFieldDelegate et implémente les méthodes textFieldShouldReturn: et textFieldDidEndEditing :. textFieldShouldReturn: annule le statut de premier répondant qui, selon la documentation, devrait également déclencher textFieldDidEndEditing :, mais je ne vois jamais textFieldDidEndEditing: appelé.

- (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
    if (theTextField == thresholdValue) {
        [thresholdValue resignFirstResponder];
    }
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self updateThresholdValue:textField];
}

Il convient de noter que j’ai également essayé de connecter certains événements de champ de texte au délégué et d’appeler l’événement call updateThresholdValue: directement, mais cela ne fonctionnait pas non plus.

Était-ce utile?

La solution 3

Comme mentionné dans l'un des commentaires, j'ai essayé de reproduire une version plus simple de ce que j'essayais de faire à l'aide d'une application HelloWorld, et cela a fonctionné du premier coup, sans aucun problème, comme prévu. Face à cela, j'ai commencé à me poser des questions.

Quelque part dans toutes mes recherches sur Google pour tenter de trouver une réponse à ce problème, je suis tombé sur un lien où une personne avait un problème avec les événements ne se déclenchant pas à l'aide d'un bouton, et il s'est avéré que le problème était lié à la vue dans laquelle le bouton a été placé et cette vue ayant une autre sous-vue en tant qu'homologue du bouton, et cette sous-vue dévorait en quelque sorte les événements plutôt que de leur permettre d'aller où ils avaient été dirigés. Le scénario n'était pas exactement le même que le mien, mais il semblait assez proche pour qu'une enquête en vaille la peine. Malgré tous les excellents conseils reçus ici, aucun n’a encore porté ses fruits.

Hier soir, j'ai décidé de recréer complètement le fichier nib (à partir d'une copie de ce que j'avais en premier), et je l'ai fait fonctionner. La principale différence semble être que, dans le fichier NIB original qui ne fonctionnait pas, j'avais glissé sur un TableViewController de la palette, puis changé son type en ma sous-classe PZTableViewController . Quand j'ai fait la même chose dans ma nouvelle plume, les événements ne se sont pas déclenchés. Si, au contraire, j'ai supprimé le TableViewController et l'ai simplement glissé sur un NSObject et modifié sa classe en PZTableViewController et l'a inséré dans le plomb tout en haut, tout "juste travaillé".

Je vais essayer de rechercher le lien qui m'a permis de commencer cette réflexion et de le publier sous forme de modification ou de commentaire.

Ce n’est pas non plus une réponse complète, car je ne comprends pas encore la différence entre le TableViewController de la palette et ma sous-classe. Lorsque j'aurai compris cela, je mettrai à jour cette réponse via modification ou commentaire.

Autres conseils

Vient de rencontrer le même problème que vous avez décrit. Après avoir tout essayé, j'ai ajouté cette méthode de délégation:

// if we encounter a newline character return
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{   
    // enter closes the keyboard
    if ([string isEqualToString:@"\n"])
    {
        [textField resignFirstResponder];
        return NO;
    }
    return YES;
}

Maintenant, le textFieldShouldEndEditing est déclenché et le champ de texte abandonne le premier répondant.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

textFieldDidEndEditing est déclenché lorsque le champ de texte renonce à son statut de premier répondant alors que textFieldShouldReturn est déclenché lorsque le bouton de retour est enfoncé.

Cela semble comme si votre champ de texte ne démissionnait jamais en tant que premier répondeur. Vous pouvez le vérifier assez facilement en mettant une sortie de débogage (comme suggéré dans les commentaires) et en naviguant hors du champ de texte avec une touche tactile - par exemple, commencez à taper puis touchez juste à l'extérieur du champ pour le forcer à quitter le premier Répondeur.

Je ne suis pas sûr que cela aide beaucoup, mais cela ressemble à un cas étrange que vous frappez.

Je me suis retrouvé dans le cahier d'éditionChanged d'enregistrer chaque modification dans un champ de texte plutôt que de chercher à couvrir tous les cas avec les rappels restants.

Très "efficace" en raison de la "facilité d'utilisation" androïde-like du textFieldDidEndEditing (sarcasme).

Si vous avez adopté le protocole UITextFieldDelegate dans votre contrôleur de vue, écrivez la ligne de code suivante dans la méthode viewDidLoad pour activer les méthodes du protocole ci-dessus dans vos champs de texte correspondants:

override func viewDidLoad() {
    //other stuff
    yourTextField.delegate = self
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top