You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:13:12