NSTextView に次の文字列があります。
ホルスは父オシリスの仇を討った
Horus
これにはとの 2 つのタグが割り当てられていますOsiris
。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];
}
}
frist タグ (上記の例でHorus
は ) がスキャンされた文字列の最初 (location = 0) にある場合、これは失敗します。タグが見つからず、コードがループし続けます。
ただし、文字列を次のように置き換えると:
10年後、ホルスは父オシリスの仇を討った
...すべて機能し、両方のタグが(予想どおり)見つかり、適切に強調表示されます。
何か不足していますか、それとも NSScanner のバグですか?