2010-12-29 6 views
3

ich auf einem vorhandenen NSAttributedString den folgenden Selektor bin Aufruf ohne kCTFontAttributeName Bereiche:Stopp enumerateAttribute: InRange: Optionen: usingBlock: von meinem Block mit Null-Wert Aufruf

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

und ich die Ausgabe unten, aber Ich würde erwarten, keine Ausgabe zu bekommen. Vorschläge?

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

Was passiert, wenn Sie '0' als Optionsparameter übergeben? Der Wortlaut in der Dokumentation zu "... LongestEffectiveRangeNotRequired" ist etwas suspekt ... – danyowdee

+0

Ich bekomme immer noch NULL, nur wenige von ihnen. –

Antwort

8

Die kurze Antwort? -enumerateAttribute:inRange:options:usingBlock: tut nicht, was Sie (oder ich, ursprünglich) dachten, dass es tut.

Von dem Namen, könnten Sie davon ausgehen, nur zählt über Bereiche des Empfängers, die das angegebene Attribut enthalten. Das ist nicht der Fall. Es immer zählt über die gesamte Zeichenfolge. Es ruft den Block auf, der jeweils run es trifft. Der value, der in den Block übergeben wird, wird auf den Wert des angegebenen Attributs für diesen Lauf gesetzt. Wenn der aktuelle Lauf das angegebene Attribut nicht enthält, wird nil für value übergeben.

Für eine Zeichenfolge, die das angegebene Attribut nicht enthält, wird der Block dennoch ausgelöst, aber value wird immer nil sein. Bei einer Zeichenfolge, die vollständig vom angegebenen Attribut abgedeckt wird (mit demselben Wert), würden Sie erwarten, dass der Block einmal ausgelöst wird, wobei value dem Wert dieses Attributs in der Zeichenfolge entspricht. Für eine Zeichenfolge, die teilweise von dem angegebenen Attribut abgedeckt wird, würden Sie erwarten, dass der Block mehrmals ausgelöst wird, manchmal mit einer value von nil und manchmal mit einer value, die der des Attributs entspricht.

Hoffnung, das hilft. Es hat auch eine Weile gedauert, bis ich es aus der richtigen Richtung gesehen habe.

+0

Können Sie bitte auf die Dokumentation oder eine E-Mail von jemandem von Apple verlinken, der dies beschreibt? Ich stimme zu, dass dies das Verhalten ist, das ich erlebe, aber ich suche hauptsächlich nach einem offiziellen Grund. –

+0

Ich glaube nicht, dass es einen "Grund" an sich gibt. Die kanonische Dokumentation sagt einfach "Führt den Block für das angegebene Attribut aus, das im angegebenen Bereich ausgeführt wird." Dies entspricht sowohl unserem erwarteten Verhalten als auch dem oben beschriebenen * tatsächlichen * Verhalten. Wenn Sie nach etwas Konkreterem suchen, sollten Sie einen Dokumentationsfehler bei Apple einreichen. – jemmons

+0

Ich stimme zu, dass die Dokumentation nicht eindeutig ist, aber normalerweise antwortet der Apple Engineer auf der Mailingliste schnell. Text von einer E-Mail von ihm wäre großartig. –