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実行の指定された属性の値に設定されます。現在の実行に指定された属性が含まれていない場合は、 for に合格nilvalueます。

したがって、指定された属性を含まない文字列の場合でも、ブロックは起動しますが、value常にnil. 指定された属性 (同じ値を持つ) によって完全にカバーされるvalue文字列の場合、文字列内のその属性の値と等しいブロックが 1 回起動することが期待されます。特定の属性によって部分的にカバーされている文字列の場合、ブロックが複数回起動することが予想されます。場合によってはvalueofnilで、場合valueによっては属性のそれと同じです。

それが役立つことを願っています。正しい方向から見るのにも時間がかかりました。

于 2012-07-08T17:23:26.580 に答える