【问题标题】:Remarkable behaviour by NSScannerNSScanner 的显着行为
【发布时间】:2023-03-13 22:02:02
【问题描述】:

我在 NSTextView 中有以下字符串:

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

为此分配了两个标签,HorusOsiris。我使用 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 中的错误?

【问题讨论】:

    标签: cocoa nsscanner


    【解决方案1】:

    查看文档

    - (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString **)stringValue

    如果 stopString 是接收者中的第一个字符串,则该方法返回 NO 并且 stringValue 不变。

    扫描器找到了字符串,但返回 NO,因为它没有扫描任何字符来这样做。然后,您的代码不会增加 position 变量,因为该部分位于 if (result) 块内。

    我认为删除 if 语句应该可以解决问题。如果扫描器没有找到 stopString,while 条件将失败,代码根本不会进入循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2012-05-01
      相关资源
      最近更新 更多