[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时做错了吗?
答案 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
分配新值时,调用块的代码不知道您更改了它。更改不会传播到块的范围之外。