开发者

iPhone Programming: Deactivate spell check in UITextView

开发者 https://www.devze.com 2023-01-08 19:40 出处:网络
UITextAutocorrectionTypeNo didn\'t work for me. I\'m working on a crossword app for the iPhone. The questions are in UITextViews and I use UITextFields for the User-Input of each letter.

UITextAutocorrectionTypeNo didn't work for me.

I'm working on a crossword app for the iPhone. The questions are in UITextViews and I use UITextFields for the User-Input of each letter. By touching a question(UITextView), the TextField for the first answer char becomesFirstResponder.

It all works fine but the UITextViews are still spell checking and mark the wrong words in the question, even if I set them 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 method开发者_StackOverflowe 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;
}

I don't call UITextView on any other place.


I had the same problem. The solution is very simple but not documented: You can only change the properties defined in the UITextInputTraits protocol while the UITextView in question is NOT the first responder. The following lines fixed it for me:

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

Hope this helps somebody.


One potentially-helpful tip following from Engin Kurutepe's answer:

If you have subclassed UITextView, you can override the UITextInputTraits in the subclass implementation of becomeFirstResponder, something like this:

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

There is then no need to explicitly resign/becomeFirstResponder around your trait changes.


Important

Disabling spell check will NOT update the UI of the red-line until the text itself is also updated. Simply setting the spellCheck to NO is not enough.

To force a UI update, set the spellcheck property to NO, then toggle the text blank then back, like so:

_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;
}


Got a solution but it's not really how it should be. If someone knows something better, please tell me.

The autocorrection executes, after the first touche. So I alloc a new UITextView and set him like the touched TextView. Then I replace the touched textView with my new TextView. So every UITextView instance could only be touched once and disappears. :)

//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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消