Возникли проблемы с UITextChecker - Xcode / iPhone - PullRequest
1 голос
/ 17 марта 2011

Я пытался использовать UITextChecker, чтобы увидеть, является ли слово внутри строки на самом деле словом.Я собрал воедино код, используя примеры, которые нашел в Интернете, но на самом деле я этого не понимаю, и он немного выше моего уровня.Может кто-нибудь помочь мне понять, как проверить, является ли слово в строке действительно словом?Я все еще изучаю все это, так что спасибо огромное!

-(IBAction)pushButton:(id)sender{
label.text = textField.text;
NSString * currentWord;
currentWord = label.text;
NSRange range = NSMakeRange(0, 0);
range = [textChecker rangeOfMisspelledWordInString:[currentWord lowercaseString] 
                                             range:NSMakeRange(0, [currentWord length]) 
                                        startingAt:0 
                                              wrap:NO 
                                          language:@"en_US"];
if (range.location == NSNotFound) {
    NSLog(@"Word found");
}
    else {
        NSLog(@"Word not found");
    }

}

ОБНОВЛЕНИЕ: У меня все еще проблемы с этим, поскольку мой журнал показывает «Слово не найдено», независимо от того, что я помещаю втекстовое поле.Я также хотел опубликовать свой файл .h, чтобы увидеть, что-то не так.Также здесь есть ссылка на то, где я получил оригинальный код, на случай, если это поможет.Еще раз спасибо.

 #import <UIKit/UIKit.h>
#import <UIKit/UITextChecker.h>

@interface CheckIfWordViewController : UIViewController {
    IBOutlet UILabel * label;
    IBOutlet UITextField * textField;
    IBOutlet UIButton * button;
    UITextChecker * textChecker;
}
@property (retain, nonatomic) UITextChecker * textChecker;
@property (retain, nonatomic) UIButton * button;
@property (retain, nonatomic) UILabel * label;
@property (retain, nonatomic) UITextField * textField;


-(IBAction)pushButton:(id)sender;

@end

Ответы [ 5 ]

3 голосов
/ 01 января 2012

Меня поймал UITextChecker, который всегда возвращал NSNotFound даже для слов с ошибками, потому что я кормил его CAPs только словами.Небольшая проблема для новобранцев решена путем отправки [currentWord lowercaseString].Из этого исследования я также обнаружил, что слова длиной более 25 символов также возвращают NSNotFound независимо от неправильного написания.

0 голосов
/ 03 июля 2012

Возможно, вы забыли ALLOC / INIT для UITextChecker

Работает следующим образом:

- (IBAction)CheckWord:(id)sender
{
  UITextChecker *Checker = [[UITextChecker alloc] init];

  NSRange range = [Checker rangeOfMisspelledWordInString:[_Word.text lowercaseString] 
                                                    range:NSMakeRange(0, [_Word.text length]) 
                                               startingAt:0 wrap:NO 
                                                 language:@"it_IT"];

  if ( range.location == NSNotFound ) {
    _Esito.text = @"Word found";
  }
  else {
    _Esito.text = @"Word not found";
  }

  [Checker release];
}

Для языков используйте

NSLog(@"%@", [UITextChecker availableLanguages]);

надеюсь, это поможет.

0 голосов
/ 17 марта 2011

Ваш код выглядит правильно, я думаю, из вашего вопроса вы хотите, чтобы он объяснил?

    label.text = textField.text;

Эта строка берет текст, введенный в textField (который предположительно является UITextField), и присваивает его текстовому свойству label (которое предположительно является UILabel). Это не имеет ничего общего с проверкой орфографии per se .

    NSString * currentWord;
    currentWord = label.text;

Копирует текстовую строку обратно из свойства text метки.

    NSRange range = NSMakeRange(0, 0);

Это объявляет структуру NSRange и инициализирует ее пустым значением. В этом нет необходимости, поскольку следующая строка все равно изменит его.

    range = [textChecker rangeOfMisspelledWordInString:[currentWord lowercaseString] 
                                                 range:NSMakeRange(0, [currentWord length]) 
                                            startingAt:0 
                                                  wrap:NO 
                                              language:@"en_US"];

Это строка, которая на самом деле делает работу.

  • Вы ищете слова с ошибками в текстовой строке ранее. Это для хорошей меры, я не знаю, если это строго необходимо.
  • range:NSMakeRange(0, [currentWord length]) указывает, что следует искать всю строку (от символа 0 до длины строки).
  • startingAt:0 указывает, что он должен начинаться с начала диапазона. Использование этого было бы в цикле, после нахождения первого слова с ошибкой вы сказали бы ему начинать после конца слова, чтобы найти другое.
  • wrap:NO говорит, что не следует начинать сначала с начала диапазона, если слово с ошибкой. Не то, что здесь имеет значение.
  • `language: @" en_US "говорит ему использовать встроенный в США словарь английского языка.

Кажется, что нет никакого способа указать пользовательский словарь, кстати.

    if (range.location == NSNotFound) {
        NSLog(@"Word found");
    }
    else {
        NSLog(@"Word not found");
    }

Это просто проверяет результат. Если найдено слово с ошибкой, range.location будет началом слова, а range.length будет длиной. Если все слова написаны правильно, range.location будет NSNotFound и range.length будет 0.

0 голосов
/ 24 апреля 2011

Где вы размещаете UITextChecker?В методе инициализации контроллера, я предполагаю?Просто проверяю, потому что решение работает для меня, с одним изменением: вместо передачи @ "en_us" в метод rangeOfMisspelledWords... я делаю следующее:

UITextChecker* checker = [[UITextChecker alloc] init];
NSString* preferredLang = [[UITextChecker availableLanguages] objectAtIndex:0];
NSRange range;
range = [checker rangeOfMisspelledWordInString:currentWord
                                         range:NSMakeRange(0, [currentWord length]) 
                                    startingAt:0 
                                          wrap:NO
                                      language:preferredLang];

После того же оператора if, который вы используете,Решение работает, и также будет работать для пользователей других языков без изменений, если вы решите локализовать свое приложение.

Возможно, по какой-то причине используемая вами @ "en_US" не является правильной строкой для передачи?Хотя это кажется правильным.

0 голосов
/ 17 марта 2011

Ваш код выглядит так, как будто он передает одно слово в rangeOfMisspelledWordInString - я думаю, что вы хотите использовать всю строку и использовать возвращенный NSRange, чтобы определить, какое слово в конкретном UITextChecker считает неправильным.Поэтому вместо currentWord передайте всю строку.Если ничего не написано неправильно, вы получаете range.location == NSNotFound, как вы работали.

Проверка слова так же хороша, как словарь, который вы проверяете.Я полагаю, что именно Дон Кнут разработал этот метод для проверки слов:

  1. Получить словарь
  2. Создать копию словаря со всеми отсортированными записями так, чтобы индекс отсортированного слова совпадал с индексом не отсортированного слова
  3. Сортировать слово-кандидат
  4. Найти отсортированное слово-кандидат в отсортированном словаре
  5. Индекс (и может быть несколько) совпадения - это ваше слово.

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

Я не знаю точно, какие словари использует UITextChecker, но ничто не раздражает людей больше, чем отклонение правильного слова ... особенно, если они немного считают свое словонеясны и умны в использовании.Использование всеобъемлющего словаря, такого как официальный справочник Scrabble, позволит избежать этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...