2011-03-17 51 views
1

我一直試圖使用UITextChecker來查看一個字符串中的單詞是否實際上是一個單詞。我用我在網上找到的例子將代碼拼湊在一起,但我並不真正瞭解它,而且它比我的水平高一些。任何人都可以幫助我弄清楚如何檢查字符串中的單詞是否真的是一個單詞?我仍然在學習所有這些,所以非常感謝!UITextChecker遇到問題 - Xcode/iPhone

-(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 

回答

0

您的代碼看起來是傳遞一個詞來rangeOfMisspelledWordInString - 我想你想使用的整個字符串,並使用返回NSRange識別哪些字特別UITextChecker跟着感覺走拼寫錯誤。所以,而不是currentWord,傳遞整個字符串。如果沒有任何拼寫錯誤,你會得到range.location == NSNotFound

單詞檢查與您檢查的字典一樣好。我相信這是唐克努特誰想出這個方法來檢查的話:

  1. 獲取字典
  2. 創建排序的所有條目字典的副本,以便分類詞索引相匹配無序字索引
  3. 排序候選詞
  4. 在已排序字典中查找已排序的候選字
  5. 匹配的索引(可能有倍數)就是你的字。

在你的情況下,你只關心是否有零匹配或其他。如果至少有一場比賽,你有一個有效的單詞。

我不確切知道UITextChecker使用什麼字典,但沒有什麼會比拒絕一個正確的單詞更讓人煩惱......特別是如果他們認爲他們的單詞有點模糊,並且自己使用它的話很聰明。使用像Scrabble官方參考文件這樣的全能字典可以避免這個問題。

+0

謝謝。對於這個應用程序,我只需要一次檢查一個單詞。但我也會研究這個Don Knuth方法。 – 2011-03-17 02:17:53

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告訴它如果拼寫錯誤的單詞不要從範圍的開始處重新開始。這不重要。
  • `語言:@「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

感謝您的解釋。現在很多東西都變得更有意義。出於某種原因,無論我在文本框中輸入了什麼內容,都會返回「未找到單詞」。即使它是一個真正的詞。你能否告訴我是否還錯過了一些東西? – 2011-03-17 02:07:47

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」不是要傳遞的正確字符串?這似乎是正確的。

3

我被UITextChecker抓住了,即使拼寫錯誤的單詞也總是返回NSNotFound,因爲我只餵了CAP。提交[currentWord lowercaseString]解決了新手的一個小問題。我也從研究中發現,無論拼寫錯誤,超過25個字符的單詞都會返回NSNotFound。

0

也許你已經忘記ALLOC /對UITextChecker

作品以這種方式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]); 

希望這會有所幫助。