关于AttributeString - 使多次出现变为粗体

时间:2012-03-12 12:47:23

标签: iphone ios ipad

我试图使用类似以下内容的

在属性字符串粗体中多次出现
[attrStr setFont:[UIFont ...] range:[attrStr.string rangeOfString:@"hello world"]];

如你所知,'rangeOfString'总是返回匹配的第一次出现...我仍然是iOS的新手,只是想知道将所有出现设置为粗体的最佳方法是什么...是否提供了任何功能NSString还是什么?

提前致谢!

3 个答案:

答案 0 :(得分:24)

您应首先尝试获取字符串中的所有范围,然后为每个范围设置属性。 stackoverflow上有一些很棒的代码示例:https://stackoverflow.com/a/4653266/381870

编辑:

以下是您的示例

- (NSArray *)rangesOfString:(NSString *)searchString inString:(NSString *)str {
    NSMutableArray *results = [NSMutableArray array];
    NSRange searchRange = NSMakeRange(0, [str length]);
    NSRange range;
    while ((range = [str rangeOfString:searchString options:0 range:searchRange]).location != NSNotFound) {
        [results addObject:[NSValue valueWithRange:range]];
        searchRange = NSMakeRange(NSMaxRange(range), [str length] - NSMaxRange(range));
    }
    return results;
}

用法:

NSArray *results = [self rangesOfString:@"foo" inString:@"foo bar foo"];
NSLog(@"%@", results);

给你

(
    "NSRange: {0, 3}",
    "NSRange: {8, 3}"
)

答案 1 :(得分:1)

将Tim的答案转换为Swift 4:

react native

还对Swift的String原语进行了处理:

extension NSString {
    open func ranges(of searchString: String) -> [NSRange] {
        var ranges = [NSRange]()
        var searchRange = NSRange(location: 0, length: self.length)
        var range: NSRange = self.range(of: searchString)
        while range.location != NSNotFound {
            ranges.append(range)
            searchRange = NSRange(location: NSMaxRange(range), length: self.length - NSMaxRange(range))
            range = self.range(of: searchString, options: [], range: searchRange)
        }
        return ranges
    }
}

答案 2 :(得分:0)

您将不得不使用NSScanner扫描文本并替换它。您可以找到NSScanner here的示例。