4

我在NSAttributedString没有kCTFontAttributeName范围的现有选择器上调用以下选择器:

[attributedString enumerateAttribute:(NSString *) kCTFontAttributeName
                             inRange:NSMakeRange(0, [attributedString length])
                             options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
                          usingBlock:^(id value, NSRange range, BOOL *stop) {
    NSLog(@"Attribute: %@, %@", value, NSStringFromRange(range));
}];

我得到下面的输出,但我希望没有输出。建议?

Attribute: (null), {0, 27}
Attribute: (null), {27, 1}
Attribute: (null), {28, 1}
Attribute: (null), {29, 1}
Attribute: (null), {30, 1}
4

1 回答 1

11

简短的回答?-enumerateAttribute:inRange:options:usingBlock:不做你(或我,最初)认为的事情。

从名称中,您可能会假设它枚举包含给定属性的接收器的范围。不是这种情况。它总是枚举整个字符串。它为遇到的每次运行调用块。传递到块中的value值设置为该运行的给定属性的值。如果当前运行不包含给定属性,则通过nilfor value

因此,对于不包含给定属性的字符串,它仍然会触发该块,但value始终是nil. 对于完全被给定属性(具有相同值)覆盖的字符串,您会期望该块value在等于字符串中该属性的值的情况下触发一次。对于部分被给定属性覆盖的字符串,您会期望该块多次触发,有时使用 a valueof nil,有时使用value等于属性的。

希望有帮助。我也花了一段时间才从正确的方向看它。

于 2012-07-08T17:23:26.580 回答