使用UITextChecker时遇到问题 - Xcode / iPhone

时间:2011-03-17 01:09:57

标签: iphone xcode

我一直在尝试使用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");
    }

}

更新:我仍然遇到这个问题,因为我的日志显示“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 个答案:

答案 0 :(得分:3)

我被UITextChecker抓住了,即使是拼写错误的单词也总是返回NSNotFound,因为我只给CAP填充单词。通过提交[currentWord lowercaseString]解决了新手的一个小问题。我还从研究中发现,超过25个字符的单词也将返回NSNotFound而不管拼写错误。

答案 1 :(得分:0)

您的代码看起来像是将一个单词传递给rangeOfMisspelledWordInString - 我想您想要使用整个字符串并使用返回的NSRange来识别特定UITextChecker认为哪个单词拼写错误。因此,而不是currentWord,传递整个字符串。如果没有拼写错误,你得到的就是range.location == NSNotFound

单词检查与您检查的词典一样好。我相信Don Knuth设计了这种检查单词的方法:

  1. 获取字典
  2. 创建字典副本,其中所有条目都已排序,以便排序后的单词索引与未排序的单词索引
  3. 匹配
  4. 对候选词进行排序
  5. 在排序字典中查找已排序的候选词
  6. 匹配的索引(可能有倍数)就是你的话。
  7. 在您的情况下,您只关心零匹配或其他情况。如果至少有一个匹配,则您有一个有效的单词。

    我不确切知道UITextChecker使用的字典究竟是什么,但是没有什么比摒弃一个正确的词更能让人烦恼...特别是如果他们认为他们的话有点模糊,而且他们自己也很聪明地使用它。使用像官方拼字游戏参考这样的无所不包的字典可以避免这个问题。

答案 2 :(得分:0)

您的代码看起来是正确的,我想您想要解释一下这个问题吗?

    label.text = textField.text;

此行接受在textField(可能是UITextField)中输入的文本,并将其分配给label的文本属性(可能是UILabel)。它与拼写检查本身无关。

    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”告诉它使用内置的美国英语词典。

似乎没有任何方法可以指定自定义词典,BTW。

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

这只是检查结果。如果找到拼写错误的单词,range.location将成为单词的开头,range.length将是长度。如果所有单词拼写正确,则range.location将为NSNotFound,range.length将为0。

答案 3 :(得分:0)

你在哪里分配UITextChecker?在控制器的init方法中,我假设?只是检查一下,因为解决方案适用于我,只需要进行一次更改:不要将@“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”不是正确的字符串传递?看来是对的。

答案 4 :(得分:0)

可能你忘记了UITextChecker

的ALLOC / INIT

以这种方式工作:

- (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]);

希望这会有所帮助。