YYTextHighlight tapAction 点击无效

当使用YYTextHighlight设置 attributedText 后,必须确保标签的 tapAction 在设置字符串高亮之后执行,否则点击事件将无法正常触发。解决方法是先设置字符串,再设置高亮并绑定点击行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YYTextHighlight *hl = [[YYTextHighlight alloc] init];
    [string yy_setTextHighlight:hl range:NSMakeRange(3, 8)];
    hl.tapAction = ^
<think>嗯,用户的问题是如何在YYTextView中设置@回复功能的文字颜色,这属于富文本显示问题。从用户的补充引用看,他们显然已经查阅过资料,但引用的都是普通UITextField和UITextView的解决方案,直接套用到YYTextView上可能行不通。用户提到的引用[1][2]涉及KVC修改placeholder颜色导致崩溃的问题,这说明用户对底层修改方式的风险已有认知;引用[3]展示了文本编辑事件回调的用法,用户可能希望用类似回调动态修改文本颜色;引用[4]的绘图机制虽然不直接相关,但暗示用户具备自定义绘制的意识。这些线索告诉我,用户需要的是既安全又能精确控制特定文本样式的方案。重点在于YYTextView的文本特性。YYTextView作为功能更强大的文本控件,应该支持通过正则匹配来设置文本属性。考虑到@回复的格式通常是“@用户名”的模式,正则表达式是最可靠的匹配方式。具体实现需要分三步走:首先创建匹配@符号加连续非空白字符的正则规则(例如“@[^\\s]+”),然后构建包含目标颜色属性的NSAttributedStringKey字典,最后调用YYTextView的富文本配置接口。由于用户可能需要响应点击事件,顺便补充了YYTextView的文本附件特性作为拓展方案。特别要注意避免用户走弯路:必须强调不要使用placeholder这种错误思路,同时预警私有API的风险(比如直接操作内部的_RPLabel)。在示例代码里特意用显眼的注释标出了关键的正则匹配参数,因为这是实现效果的核心。</think> 在 YYTextView 中设置 `@回复` 特定文本颜色的正确方法是 **使用正则表达式匹配结合富文本属性**。以下是详细步骤和代码: --- ### 解决方案步骤 (Swift示例) ```swift // 1. 创建文本属性字典 let attributes: [NSAttributedString.Key: Any] = [ .foregroundColor: UIColor.systemBlue, // 设置 @回复 的文本颜色 .font: UIFont.systemFont(ofSize: 16) // 可选:设置字体 ] // 2. 配置正则表达式规则 let pattern = "@[\\u4e00-\\u9fa5a-zA-Z0-9_]+" // 匹配 "@中文/英文/数字/下划线" let regex = try! NSRegularExpression(pattern: pattern) // 3. 为 YYTextView 设置文本匹配规则 let textView = YYTextView() textView.textParser = YYTextMatchBindingParser() textView.textParser?.parseText(textView.attributedText, selectedRange: nil) // 4. 绑定正则表达式与文本样式 if let matchParser = textView.textParser as? YYTextMatchBindingParser { matchParser.regexAttributes = [regex: attributes] // 关键:关联正则与颜色 } ``` --- ### 关键说明: 1. **正则表达式原理** `@[\\u4e00-\\u9fa5a-zA-Z0-9_]+` 可匹配以下格式: - `@username` - `@中文昵称` - `@user_123` 2. **YYTextMatchBindingParser** YYTextKit 内置的解析器,通过正则动态为匹配文本添加富文本属性,**无需手动修改私有属性**。 3. **安全替代方案** 相比于直接操作 `_placeholderLabel`(可能导致崩溃[^1][^2]),此方法通过公开 API 实现,完全避免崩溃风险。 --- ### 完整示例场景: ```swift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let textView = YYTextView(frame: CGRect(x: 20, y: 100, width: 300, height: 200)) textView.text = "回复 @小明: 这是蓝色标签 \n普通文本保持默认颜色" // 绑定 @ 标签样式 let regex = try! NSRegularExpression(pattern: "@[\\u4e00-\\u9fa5a-zA-Z0-9_]+") let parser = YYTextMatchBindingParser() parser.regexAttributes = [ regex: [.foregroundColor: UIColor.blue] ] textView.textParser = parser view.addSubview(textView) } } ``` 效果:所有 `@用户名` 显示为蓝色,其他文本保持默认颜色。 --- ### 常见问题: **Q:为何不直接修改 `attributedText`?** A:动态编辑时需要重新解析整个文本,用 `YYTextMatchBindingParser` 可在输入时实时应用样式[^3]。 **Q:如何响应 @标签 点击?** ```swift textView.highlightTapAction = { view, attrText, range, rect in if let highlight = attrText.yy_attribute(.highlight, at: range.location) as? YYTextHighlight { print("点击了标签: \((attrText.string as NSString).substring(with: range))") } } ``` --- **提示:** 避免使用 KVC 修改私有属性(如 `_placeholderLabel`),这可能导致应用审核被拒或崩溃[^1][^2]。使用富文本 API 是安全且可持续维护的方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值