Question

Je suis sûr que ce soit dans la documentation Apple ou doit avoir reçu une réponse quelque part sur ce forum, car il semble si simple, mais je ne pouvais pas le trouver, ni moi-même solution particulièrement élégante.

Ce que j'est un UIViewController qui pousse une vue d'édition sur sa pile de navigation. La vue d'édition a un tas de UITextFields en elle. Si l'un d'entre eux est en cours d'édition lorsque le bouton de retour est touché, la méthode viewWillAppear de vue originale est appelée avant soit les méthodes déléguées UITextField de textFieldShouldEndEditing ou textFieldDidEndEditing, ou la méthode textFieldEditingEnded d'action IB liés sont appelés.

Voici un code que je l'espère le rendre plus clair:

Dans le UIViewController:

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    NSLog( @"Entering view will appear for master view" );
    nameLabelField.text = objectToEdit.name;
}
- (IBAction) editMyObject: (id) sender {
    NSLog( @"Editing the object" );
    EditViewController *evc = [[EditViewController alloc] initWithNibName: @"EditTableView" bundle: nil];
    evc.editedObject = objectToEdit;
    [self.navigationController pushViewController: evc animated: YES];
    [evc release];
}

Dans le EditViewController :

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];
    nameField.text = editedObject.name;
}
- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    if( [self.navigationController.viewControllers indexOfObject: self] == NSNotFound ) {
        NSLog( @"-- We are not in controller stack... the back button has been pushed" );
    }
}
- (BOOL) textFieldShouldEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldShouldEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
    return YES;
}
- (void) textFieldDidEndEditing: (UITextField *) textField {
    NSLog( @"In textFieldDidEndEditing" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}
- (IBAction) textFieldEditingEnded: (id) sender {
    NSLog( @"In textFieldEditingEnded" );
    // Store text field value here???
    // editedObject.name = nameField.text;
}

Le journal se termine par:

  

[...] Entrer vue apparaît pour une vue maître
  [...] Modification de l'objet
  [...] En viewWillDisappear
  [...] - Nous ne sommes pas dans la pile de contrôleur ... le bouton de retour a été poussé
  [...] Entrer vue apparaît pour une vue maître
  [...] En textFieldShouldEndEditing
  [...] En textFieldEditingEnded
  [...] Dans textFieldDidEndEditing

Je veux mettre self.editedObject.name = nameField.text avant que l'étiquette se trouve dans viewWillAppear pour la UIViewController.

Je pensé dans la méthode viewWillDisappear pour la EditViewController vérifier si l'un de mes champs de texte sont actuellement les premiers intervenants et le cas échéant obtenir leur texte et le stockage, mais cela semble être un tel bidouille qui sera une douleur à maintenir si j'ajouter ou modifier des champs de texte.

Je peux aussi mettre en œuvre le textFieldEditingChanged IB lié l'action pour définir le texte dans l'objet édité après chaque pression de touche, mais c'est aussi un peu de frais généraux puisque je dois déterminer le champ texte que je suis dans chaque combinaison de touches (rappelez-vous que je ne a montré name mais d'entre eux, il y a tout un tas).

Tout ce que je besoin est pour le montage à terminer ou de connaître l'édition sera terminée avant viewWillAppear est appelé dans le UIViewController de sorte que le nameFieldLabel est réglé correctement.

Était-ce utile?

La solution

OK, je me suis dit une solution simple après beaucoup de navigation sur le Web, la lecture du forum et la lecture manuelle. Il était, comme je doutais, très simple, une seule ligne de code ajouté. Dans la méthode viewWillDisappear du EditViewContorller J'ai simplement ajouté:

    [self.view.window endEditing: YES];

textFieldShouldEndEditing, textFieldEditingEnded et textFieldDidEndEditing tous Tracez votre décocha avant la viewWillAppear de la vue maître fait.

Alors maintenant, la méthode de viewWillDisappear ressemble à:

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];
    NSLog( @"In viewWillDisappear" );
    // Force any text fields that might be being edited to end so the text is stored
    [self.view.window endEditing: YES];
}

Et les méthodes déjà en place pour gérer le « retour » sur le clavier gérer également le bouton « Retour » sur le contrôleur de navigation.

Merci Aaron et Jeff pour votre aide et me aider réfléchir à cela.

Autres conseils

Pourquoi ne pas simplement créer votre propre bouton Retour avec cette logique dans sa méthode d'action?

Je pense que dans une perspective UX, vous devez afficher une alerte pour déterminer si l'utilisateur veut annuler l'action d'édition qu'ils étaient au milieu de la avant de quitter la vue actuelle.

En alertant l'utilisateur, vous pouvez voir s'ils ont frappé le bouton par accident ou si elles ne décident de quitter la vue, prendre les mesures appropriées.

// add this to the field(s) to be edited, selector will be called as the changes
// are being made... still difficult to handle a cancel, but should work
[objectToEdit addTarget:self action:@selector(updateNameField:) 
                         forControlEvents:UIControlEventEditingChanged];

code supplémentaire ici ...

// the method called to update object from parent view
- (void)updateNameField:(id)sender {
    <OBJECT TO UPDATE>.text = ((UITextField *)sender).text;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top