2011-07-21 52 views
9
[attributedString enumerateAttributesInRange:range options:NSAttributedStringEnumerationReverse usingBlock: 
    ^(NSDictionary *attributes, NSRange range, BOOL *stop) { 

     NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; 
     [mutableAttributes setObject:[NSNumber numberWithInt:1] forKey:@"NSUnderline"]; 
     attributes = mutableAttributes; 

    }]; 

我通過一切歸於試圖循環,並添加NSUnderline給他們。當調試它似乎像NSUnderline被添加到字典,但是當我第二次循環他們被刪除。 我在更新NSDictionaries時做了什麼錯誤?Objective C - 更改NSAttributedString中的所有屬性?

回答

20

Jonathan's answer做了解釋,爲什麼它不工作的一個好工作。爲了使它工作,你需要告訴屬性字符串使用這些新屬性。

[attributedString enumerateAttributesInRange:range options:NSAttributedStringEnumerationReverse usingBlock: 
    ^(NSDictionary *attributes, NSRange range, BOOL *stop) { 

     NSMutableDictionary *mutableAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes]; 
     [mutableAttributes setObject:[NSNumber numberWithInt:1] forKey:@"NSUnderline"]; 
     [attributedString setAttributes:mutableAttributes range:range]; 

}]; 

更改屬性字符串的屬性需要它是NSMutableAttributedString。

也有這樣做的更簡單的方法。 NSMutableAttributedString定義了addAttribute:value:range:方法,它在特定範圍內設置特定屬性的值,而不更改其他屬性。你可以用一個簡單的方法來替換你的代碼(仍然需要一個可變字符串)。

[attributedString addAttribute:@"NSUnderline" value:[NSNumber numberWithInt:1] range:(NSRange){0,[attributedString length]}]; 
+0

你可以看看我有關belongsStrings的其他問題嗎?感謝:http://stackoverflow.com/questions/6783754/objective-c-nsattributedstring-extend-attributes – aryaxt

+0

會'的addAttribute:值:範圍:'覆蓋與在相同範圍內相同的密鑰現有的價值?或者它只是根本不添加屬性? – chown

+0

@chown文檔沒有說,所以我測試了它並確認它覆蓋了現有的值。 – ughoavgfhw

6

您正在修改的詞典的本地副本;屬性字符串無法查看更改。

C中的指針是按值傳遞的(因此它們指向的是通過引用傳遞的)。因此,當您爲attributes分配新值時,調用該塊的代碼不知道是否已更改它。該更改不會傳播到該塊的範圍之外。

+0

那麼該如何解決? – aryaxt

+0

爲什麼downvote? –