Программирование на iPhone: отключить проверку орфографии в UITextView - PullRequest
9 голосов
/ 23 июля 2010

UITextAutocorrectionTypeNo не работает для меня.

Я работаю над приложением кроссворда для iPhone.Вопросы находятся в UITextViews, и я использую UITextFields для пользовательского ввода каждой буквы.Касаясь вопроса (UITextView), TextField для первого ответа char становитсяFirstResponder.

Все работает нормально, но UITextViews все еще проверяют орфографию и отмечают неправильные слова в вопросе, даже если я установил их 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;
}

Я не вызываю UITextView в любом другом месте.

Ответы [ 4 ]

22 голосов
/ 16 мая 2012

У меня была такая же проблема.Решение очень простое, но не документированное: вы можете изменять только свойства, определенные в протоколе UITextInputTraits, тогда как рассматриваемый UITextView НЕ является первым респондентом.Следующие строки исправили это для меня:

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

Надеюсь, это кому-нибудь поможет.

8 голосов
/ 07 марта 2013

Один потенциально полезный совет, следующий из ответа Engin Kurutepe :

Если у вас есть UITextView с подклассами, вы можете переопределить UITextInputTraits в реализации подкласса becomeFirstResponder,что-то вроде этого:

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

Тогда нет необходимости явно resign / becomeFirstResponder вокруг изменений вашей черты.

1 голос
/ 22 августа 2018

Важно

Отключение проверки орфографии НЕ обновит интерфейс красной линии до тех пор, пока сам текст также не будет обновлен.Недостаточно просто установить для spellCheck значение NO.

Чтобы принудительно обновить пользовательский интерфейс, установите для свойства spellcheck значение NO, затем переключите текст, затем верните его обратно, например, так:

_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;
}
0 голосов
/ 23 июля 2010

Есть решение, но оно не совсем так, как должно быть. Если кто-то знает что-то лучше, пожалуйста, скажите мне.

Автокоррекция выполняется после первого касания. Поэтому я выделяю новый UITextView и устанавливаю его как TouchView TextView. Затем я заменяю текстовое представление, которого коснулись, новым текстом. Таким образом, каждый экземпляр UITextView можно было коснуться только один раз и исчезнуть. :)

//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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...