Cocoa NSScanner的卓越行为

Cocoa NSScanner的卓越行为,cocoa,nsscanner,Cocoa,Nsscanner,NSTextView中有以下字符串: 荷鲁斯为他的父亲欧西里斯报仇 为此分配了两个标记,Horus和Osiris。我使用NSScanner扫描字符串中的两个标记,并在找到时以黄色背景突出显示它们 代码是: for (Tag *aTag in tags) { NSString *aTagName = [aTag name]; NSUInteger strLength = [aTagName length]; NSScanner *aScanner = [[NSScanner

NSTextView中有以下字符串:

荷鲁斯为他的父亲欧西里斯报仇

为此分配了两个标记,
Horus
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];
    }
}
当第一个标记(在上例中为
Horus
)位于扫描字符串的最开头(位置=0)时,此操作失败。找不到标记,代码继续循环

但是,当我将字符串替换为:

10年后,荷鲁斯为父亲欧西里斯报仇

。。。这一切都很有效,我的两个标签都被找到(如预期的那样)并很好地高亮显示

我是否遗漏了什么,或者这是NSScanner中的一个错误?

有关详细信息,请参阅文档

-(BOOL)scanupString:(NSString*)stopString到string:(NSString**)stringValue

如果stopString是接收器中的第一个字符串,则该方法返回NO,并且stringValue不会更改

扫描程序已找到该字符串,但返回“否”,因为它尚未扫描任何字符以执行此操作。然后,您的代码不会增加
位置
变量,因为该部分位于
if(result)
块中

我认为删除
if
语句应该可以解决这个问题。如果扫描仪没有找到停止字符串,则
while
条件将失败,代码根本不会进入循环