Objective C - 更改NSAttributedString中的所有属性?

时间:2011-07-21 20:37:56

标签: iphone objective-c nsdictionary nsattributedstring

[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时做错了吗?

2 个答案:

答案 0 :(得分: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]}];

答案 1 :(得分:5)

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

C中的指针按值传递(因此它们指向的是通过引用传递的。)因此,当您为attributes分配新值时,调用块的代码不知道您更改了它。更改不会传播到块的范围之外。