2

我在自定义表格单元格中有多个 UILabel。这些标签包含不同的文本或不同的长度。

就目前而言,我有 UILabel Subclassed 允许我实现这些方法

- (void)boldRange:(NSRange)range {
if (![self respondsToSelector:@selector(setAttributedText:)]) {
    return;
}
NSMutableAttributedString *attributedText;
if (!self.attributedText) {
    attributedText = [[NSMutableAttributedString alloc] initWithString:self.text];
} else {
    attributedText = [[NSMutableAttributedString alloc]initWithAttributedString:self.attributedText];
}
     [attributedText setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]} range:range];
self.attributedText = attributedText;
NSLog(@"%@", NSStringFromRange(range));
}

- (void)boldSubstring:(NSString*)substring {
    NSRange range = [self.text rangeOfString:substring];
    [self boldRange:range];
}

这使我可以调用[cell.StoryLabel boldSubstring:@"test"];哪个将BOLD单词“test”的第一次出现。

我所追求的是能够创建新的子类方法或扩展我已经拥有的方法,以允许我替换标签中指定单词的所有出现。

我研究了许多方法,包括 3rd 方框架。我遇到的麻烦是这对我来说是一个学习过程。我自己尝试完成这项工作对我来说会更有益。

提前致谢!

4

1 回答 1

4

rangeOfString返回第一次出现,这是正常行为。从文档

查找并返回给定字符串在接收器中第一次出现的范围。

您可以使用 aNSRegularExpression和使用matchesInString:options:range来获取 a NSArrayof NSTextCheckingResult(具有NSRange属性),使用 afor loop将其加粗。

这应该可以解决问题:

- (void)boldSubstring:(NSString*)substring
{
    if (![self respondsToSelector:@selector(setAttributedText:)])
    {
        return;
    }

    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: substring options:NSRegularExpressionCaseInsensitive error:&error];

    if (!error)
    {
        NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:[self text]];
        NSArray *allMatches = [regex matchesInString:[self text] options:0 range:NSMakeRange(0, [[self text] length])];
        for (NSTextCheckingResult *aMatch in allMatches)
        {
            NSRange matchRange = [aMatch range];
            [attributedString setAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:self.font.pointSize]} range: matchRange];
        }
        [self setAttributedText:attributedString];
    }
}
于 2014-05-06T13:42:56.867 回答