UITextView富文本属性丢失求助:删除空格后自定义属性消失
UITextView富文本自定义属性删除后丢失的解决办法
我之前踩过完全一样的坑!当你给NSMutableAttributedString添加绑定了NSObject子类实例的自定义属性keyName,拼接空格富文本后,通过键盘删除那个空格,再枚举keyName属性就会发现绑定的实例不见了——这事儿太头疼了。
问题根源
UITextView在处理文本编辑(尤其是删除、修改这类操作)时,内部会重新构建富文本对象。但系统默认只认自己预定义的属性(比如NSFontAttributeName、NSForegroundColorAttributeName),自定义属性会被自动过滤掉,这就是属性丢失的核心原因。
解决步骤
1. 注册自定义属性键
你需要提前告诉系统:这个自定义属性是需要被保留的。调用NSAttributedString的注册方法即可:
// Objective-C 代码 [NSAttributedString registerAttributedStringKey:@"keyName"];
// Swift 代码 NSAttributedString.registerAttributedStringKey("keyName")
建议把自定义属性键改成反向域名格式(比如@"com.yourteam.customKeyName"),避免和系统或第三方库的属性键冲突。
2. 确保自定义对象支持序列化
如果你的属性值是自定义NSObject子类实例,一定要让这个类遵守NSCoding协议(Swift里遵循Codable)。因为系统在处理富文本时可能会对属性值进行序列化操作,不支持的话不仅会丢值,还可能导致崩溃。
比如Objective-C的示例:
@interface CustomObject : NSObject <NSCoding> @property (nonatomic, copy) NSString *content; @end @implementation CustomObject - (void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.content forKey:@"content"]; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super init]; if (self) { self.content = [coder decodeObjectForKey:@"content"]; } return self; } @end
3. 验证属性是否保留
删除操作后,你可以这样枚举属性来验证:
[textView.attributedText enumerateAttribute:@"keyName" inRange:NSMakeRange(0, textView.attributedText.length) options:0 usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) { if (value) { NSLog(@"自定义属性保留成功,值:%@", value); } }];
额外提醒
拼接富文本时,一定要确认自定义属性的应用范围是正确的,别不小心把属性范围设置错了(比如只应用到了部分文本,而不是你需要的整个目标文本)。
内容的提问来源于stack exchange,提问作者David Hu
相关产品推荐
相关产品推荐

