2012-01-03 50 views
0

我有以下字符串中NSTextView:卓越的表現由NSScanner

荷魯斯報復了他的父親奧西里斯

有分配給這個兩個標籤,HorusOsiris。我使用NSScanner掃描兩個標籤的字符串,並在發現時用黃色背景突出顯示它們。

的代碼是:

for (Tag *aTag in tags) { 
    NSString *aTagName = [aTag name]; 
    NSUInteger strLength = [aTagName length]; 
    NSScanner *aScanner = [[NSScanner alloc] initWithString: aString]; 
    [aScanner setCaseSensitive: YES]; 
    [aScanner setScanLocation: 0]; 
    BOOL result = [aScanner scanUpToString: aTagName intoString: nil]; 
    while (![aScanner isAtEnd]) { 
     NSUInteger position = [aScanner scanLocation]; 
     if (result) { 
      NSRange aRange = NSMakeRange(position, strLength); 
      [storage removeAttribute: NSBackgroundColorAttributeName range: aRange]; 
      if (onOrOff) { 
       [storage addAttribute: NSBackgroundColorAttributeName value: aColor range: aRange]; 
      } 
      position = position + [aTagName length]; 
      [aScanner setScanLocation: position]; 
     } 
     [aScanner scanUpToString: aTagName intoString: nil]; 
    } 
} 

這當弗里斯特標籤(在上面的例子中它是Horus)位於所述掃描串的最開始(位置= 0)失敗。未找到標記並且代碼保持循環。

然而,當我用替換字符串:

10年後報仇荷魯斯他的父親奧西里斯

...這所有的作品和我的兩個標籤中找到(如預期)和很好地突出顯示。

我錯過了什麼,或者這是NSScanner中的錯誤?

回答

2

查看的文檔爲

- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue

如果stopString是在接收器中的第一個字符串,則該方法返回NO和stringValue的不被改變。

掃描儀已找到字符串,但返回NO,因爲它沒有掃描任何字符來執行此操作。您的代碼不會增加position變量,因爲該部分位於if (result)塊內。

我認爲刪除if聲明應該可以解決問題。如果掃描器未找到stopString,那麼while條件將失敗,並且代碼根本不會進入循環。