我在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];
}
}
当frist标签(在上面的示例中为Horus
)位于扫描字符串的最开头(位置= 0)时,这会失败。找不到标记,代码保持循环。
但是,当我用:
替换字符串时10年后,荷鲁斯为他的父亲奥西里斯复仇了
...一切正常,我的两个标签都已找到(正如预期的那样)并且很好地突出显示。
我是否遗漏了某些内容,或者这是NSScanner中的错误?
答案 0 :(得分:2)
查看文档
- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue
如果stopString是接收者中的第一个字符串,则该方法返回NO并且不更改stringValue。
扫描程序找到了字符串,但返回NO,因为它没有扫描任何字符来执行此操作。您的代码不会增加position
变量,因为该部分位于if (result)
块内。
我认为删除if
语句应该可以解决问题。如果扫描程序没有找到stopString,while
条件将失败,代码根本不会进入循环。