Cocoa NSScanner的卓越行为
NSTextView中有以下字符串: 荷鲁斯为他的父亲欧西里斯报仇 为此分配了两个标记,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
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
条件将失败,代码根本不会进入循环