- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 NSTextView 中有以下字符串:
Horus avenged his father Osiris
为此分配了两个标签,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)时,此操作会失败。找不到标签,代码一直循环。
但是,当我将字符串替换为:
After 10 years Horus avenged his father Osiris
...一切正常,我的两个标签都被发现(如预期)并很好地突出显示。
我是否遗漏了某些内容,或者这是 NSScanner 中的错误?
最佳答案
查看文档
- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue
If stopString is the first string in the receiver, then the method returns NO and stringValue is not changed.
扫描器已找到该字符串,但返回“否”,因为它尚未扫描任何字符来执行此操作。然后,您的代码不会增加 position
变量,因为该部分位于 if (result)
block 内。
我认为删除 if
语句应该可以解决问题。如果扫描器没有找到 stopString,while
条件将失败,代码根本不会进入循环。
关于cocoa - NSScanner 的显着行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717028/
我是一名优秀的程序员,十分优秀!