2012-10-25 1 views
3

J'ai un UITextView configuré avec un délégué. J'ai activé les attributs d'édition en réglant allowsEditingTextAttributes sur YES.UITextView ne pas déclencher textViewDidChange lors du changement d'attribut?

Lorsque l'utilisateur tape un caractère dans la vue de texte, le délégué reçoit le message textViewDidChange :.

Mais lorsque l'utilisateur modifie un attribut (comme faire une sélection et appuyer sur Gras ou Italique), aucun message textViewDidChange:.

La documentation dit expressément que textViewDidChange: devrait recevoir un message lorsque l'utilisateur modifie les attributs:

Indique le délégué que le texte ou les attributs dans la vue texte spécifié ont été modifiés par l'utilisateur.

Mais ça ne marche pas pour moi. Qu'est-ce que j'oublie ici?

+1

Vous définissez UITextViewDelegate uniquement ... –

+0

Vous ne savez pas ce que vous dites, Venkat. – stevex

Répondre

5

J'ai testé ce scénario dans iOS 6 et a la Résultat identique: les modifications d'attribut de la fenêtre contextuelle "select" n'ont pas déclenché la méthode textViewDidChange:. Il semble que ce soit un bug ou la documentation doit clarifier quel type de changement d'attribut déclencherait cet événement.

Une solution de contournement possible consiste à implémenter la méthode textViewDidChangeSelection:. Il est appelé chaque fois qu'une sélection est faite (ce que l'utilisateur devrait faire avant de changer un attribut). Vérifiez si le paramètre selectedRange.length est> 0 (ce qui signifierait qu'un mot réel a été sélectionné, au lieu de simplement déplacer le curseur), et sauvegardez cette option selectedRange. Une fois que la longueur est à zéro, cela signifie qu'ils ont désélectionné l'élément. À ce moment-là, vous pourriez prendre la gamme précédente et travailler avec le texte.

- (void)textViewDidChangeSelection:(UITextView *)textView 
{ 
    static BOOL rangeSet = NO; 
    static NSRange mySelectedRange; 
    if(textView.selectedRange.length > 0 && !rangeSet) 
    { 
     mySelectedRange = textView.selectedRange; 
     rangeSet = YES; 
    } 
    else if(textView.selectedRange.length == 0 && rangeSet) 
    { 
     // Work with text 
     NSLog(@"Working with previously select text: %d, %d", mySelectedRange.location, mySelectedRange.length); 
    } 
} 
+0

Cela ressemble à un bug, n'est-ce pas? Je vais déposer un radar. – stevex

3

Veuillez vérifier si vous avez défini UITextViewDelegate dans votre fichier .h. Aussi, vous devrez `faire

yourTextView.delegate = self 

Pour que votre affichage de texte donne le contrôle à votre classe actuelle.

+0

C'est définitivement réglé. Comme je l'ai mentionné, je reçois textViewDidChange: messages lorsque l'utilisateur tape. Mais lorsque l'utilisateur appuie sur Gras, Italique ou Souligné dans la fenêtre contextuelle d'édition, il n'y a pas de message. – stevex

3

En documentation il a également été mentionné que

This method is not called in response to programmatically initiated changes 

Donc, si vous définissez programatically gras ou en italique afin de ne pas invoquer cette méthode déléguée

+0

Je ne les configure pas par programmation - l'utilisateur les définit en tapant sur la fenêtre d'édition fournie par UITextView. – stevex

1

Je suis autour de ce par UITextView le sous-classement, remplaçant les toggleBoldface:, toggleItalics: et toggleUnderline: méthodes et appeler [self.delegate textViewDidChange:self] de ces méthodes. This answer m'a aidé à comprendre cela.

Questions connexes