9 votes

Programmation de l'iPhone : Désactiver la vérification orthographique dans UITextView

UITextAutocorrectionTypeNo n'a pas fonctionné pour moi.

Je travaille sur une application de mots croisés pour l'iPhone. Les questions sont dans des UITextViews et j'utilise des UITextFields pour l'entrée utilisateur de chaque lettre. En touchant une question(UITextView), le TextField pour le premier caractère de réponse devientFirstResponder.

Tout fonctionne bien mais les UITextViews vérifient toujours l'orthographe et marquent les mauvais mots dans la question, même si je leur ai attribué la valeur UITextAutocorrectionTypeNo .

//init of my Riddle-Class

...

for (int i = 0; i < theQuestionSet.questionCount; i++) {

    Question *myQuestion = [theQuestionSet.questionArray objectAtIndex:i];
    int fieldPosition = theQuestionSet.xSize * myQuestion.fragePos.y + myQuestion.fragePos.x;
 CrosswordTextField *myQuestionCell = [crosswordCells objectAtIndex:fieldPosition];
 questionFontSize = 6;
 CGRect textViewRect = myQuestionCell.frame;

 UITextView *newView = [[UITextView alloc] initWithFrame: textViewRect];
 newView.text = myQuestion.frageKurzerText;
 newView.backgroundColor = [UIColor colorWithRed: 0.5 green: 0.5 blue: 0.5 alpha: 0.0 ];
 newView.scrollEnabled = NO;
 newView.userInteractionEnabled = YES;
 [newView setDelegate:self];
 newView.textAlignment = UITextAlignmentLeft;
 newView.textColor = [UIColor whiteColor];
 newView.font = [UIFont systemFontOfSize:questionFontSize];
 newView.autocorrectionType = UITextAutocorrectionTypeNo;
 [textViews addObject:newView];
 [zoomView addSubview:newView];
 [newView release];
}

...

//UITextView delegate methode in my Riddle-Class

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView {

     textView.autocorrectionType = UITextAutocorrectionTypeNo;  

     for (int i = 0; i < [questionSet.questionArray count]; i++) {
      if ([[[questionSet.questionArray objectAtIndex:i] frageKurzerText] isEqualToString:textView.text]) {
        CrosswordTextField *tField = [self textfieldForPosition:
            [[questionSet.questionArray objectAtIndex:i] antwortPos]]; 
        markIsWagrecht = [[questionSet.questionArray objectAtIndex:i] wagrecht];
        if ([tField isFirstResponder]) [tField resignFirstResponder];
             [tField becomeFirstResponder];
        break;
      }
 }
 return NO;
}

Je n'appelle UITextView à aucun autre endroit.

22voto

Engin Kurutepe Points 3673

J'ai eu le même problème. La solution est très simple mais non documentée : Vous ne pouvez modifier que les propriétés définies dans le fichier UITextInputTraits tandis que le UITextView en question n'est PAS le premier intervenant. Les lignes suivantes ont réglé le problème pour moi :

[self.textView resignFirstResponder];
self.textView.autocorrectionType = UITextAutocorrectionTypeNo;
[self.textView becomeFirstResponder];

J'espère que cela aidera quelqu'un.

8voto

jdc Points 960

Un conseil potentiellement utile à la suite de Engin Kurutepe La réponse de la Commission :

Si vous avez sous-classé UITextView, vous pouvez surcharger la fonction UITextInputTraits dans l'implémentation de la sous-classe de becomeFirstResponder quelque chose comme ça :

-(BOOL)becomeFirstResponder {
    self.spellCheckingType = UITextSpellCheckingTypeNo;
    self.autocorrectionType = UITextAutocorrectionTypeNo;
    self.autocapitalizationType = UITextAutocapitalizationTypeNone;
    return [super becomeFirstResponder];
}

Il n'est donc pas nécessaire d'expliciter resign / becomeFirstResponder autour de vos changements de traits.

2voto

Albert Renshaw Points 3180

Important

La désactivation du correcteur orthographique PAS mettre à jour l'interface utilisateur de la ligne rouge jusqu'à ce que le texte lui-même soit également mis à jour. Il ne suffit pas de mettre le correcteur orthographique sur NON.

Pour forcer une mise à jour de l'interface utilisateur, définissez la propriété de vérification orthographique sur NON, puis faites basculer le texte en blanc puis en arrière, comme suit :

_textView.spellCheckingType = UITextSpellCheckingTypeNo;

NSString *currentText = _textView.text;
NSAttributedString *currentAttributedText = _textView.attributedText;
_textView.text = @"";
_textView.attributedText = [NSAttributedString new];
_textView.text = currentText;
if (currentAttributedText.length > 0) {
    _textView.attributedText = currentAttributedText;
}

0voto

Thorsten Points 59

J'ai une solution mais ce n'est pas vraiment comme ça que ça devrait être. Si quelqu'un connaît quelque chose de mieux, dites-le moi.

L'autocorrection s'exécute, après la première touche. Donc j'alloue un nouveau UITextView et le configure comme le TextView touché. Puis je remplace le TextView touché par mon nouveau TextView. Ainsi chaque instance de UITextView ne peut être touchée qu'une seule fois et disparaît :)

//UITextView delegate method in my Riddle-Class

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView {

    ...CODE FROM FIRST POST HERE...

    // ADDED CODE:
    for (int i = 0; i < [textViews count]; i++) {
        if (textView == [textViews objectAtIndex:i]) {
            UITextView *trickyTextView = [[UITextView alloc] initWithFrame:textView.frame];
            trickyTextView.text = textView.text;
            trickyTextView.font = textView.font;
            trickyTextView.autocorrectionType = UITextAutocorrectionTypeNo;
            trickyTextView.textColor = textView.textColor;
            trickyTextView.backgroundColor = textView.backgroundColor;
            trickyTextView.delegate = self;
            trickyTextView.scrollEnabled = NO;
            [textViews replaceObjectAtIndex:i withObject:trickyTextView];
            [textView removeFromSuperview];
            [zoomView addSubview:trickyTextView];
            [trickyTextView release];
            break;
        }
    }
    return NO;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X