swift textview 仿微博话题
时间: 2025-08-22 13:53:04 浏览: 4
在Swift中实现类似微博话题功能的文本视图,可以通过 `UITextView` 结合 `NSAttributedString` 和 `NSRegularExpression` 来实现话题标签的选择和高亮显示。以下是一个详细的实现思路和代码示例:
### 实现思路
1. **识别话题标签**:使用正则表达式匹配以 `#` 开头并以另一个 `#` 结尾的话题标签。
2. **高亮话题标签**:将匹配到的话题标签应用特定的字体颜色和样式。
3. **处理用户交互**:允许用户点击高亮的话题标签并触发相应的操作。
### 代码实现
#### 1. 创建 `UITextView` 并设置富文本属性
```swift
import UIKit
class TopicTextView: UITextView, UITextViewDelegate {
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
self.delegate = self
self.isEditable = false
self.dataDetectorTypes = .link
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
self.isEditable = false
self.dataDetectorTypes = .link
}
func highlightTopics(in text: String) {
let attributedString = NSMutableAttributedString(string: text)
// 使用正则表达式匹配 #话题标签#
let pattern = "#(.*?)#"
do {
let regex = try NSRegularExpression(pattern: pattern, options: [])
let range = NSRange(location: 0, length: attributedString.length)
let topicColor = UIColor.systemBlue
regex.enumerateMatches(in: text, options: [], range: range) { match, _, _ in
if let matchRange = match?.range(at: 1), let range = Range(matchRange, in: text) {
let fullTopicRange = text.range(of: "#\(text[range])#", options: .literal)!
let nsFullTopicRange = NSRange(fullTopicRange, in: text)
// 设置话题标签的样式
attributedString.addAttribute(.foregroundColor, value: topicColor, range: nsFullTopicRange)
// 添加链接属性
attributedString.addAttribute(.link, value: "topic://\(text[range])", range: nsFullTopicRange)
}
}
} catch {
print("正则表达式创建失败: $error)")
}
self.attributedText = attributedString
}
// MARK: - UITextViewDelegate
func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
if URL.scheme == "topic" {
// 处理话题标签点击事件
if let topic = URL.host {
print("话题标签被点击: $topic)")
// 这里可以触发跳转到话题详情页面等操作
}
return false // 阻止默认行为
}
return true
}
}
```
#### 2. 在视图控制器中使用 `TopicTextView`
```swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let topicTextView = TopicTextView(frame: self.view.bounds, textContainer: nil)
self.view.addSubview(topicTextView)
let sampleText = "这是一个示例文本,包含一个#话题标签#,你可以点击它查看相关内容。"
topicTextView.highlightTopics(in: sampleText)
}
}
```
### 关键点说明
- **正则表达式**:使用 `NSRegularExpression` 来匹配以 `#` 开头和结尾的标签。[^1]
- **富文本属性**:通过 `NSMutableAttributedString` 设置话题标签的前景色和链接属性。
- **链接处理**:重写 `textView(_:shouldInteractWith:in:interaction:)` 方法来处理用户点击话题标签的事件,并根据自定义 URL Scheme(如 `topic://`)执行相应的操作。
### 扩展功能
- **话题标签自动补全**:可以在用户输入 `#` 后弹出一个下拉列表,显示可能的话题标签建议。
- **话题标签数据库**:可以从服务器获取热门话题标签,并在文本中自动替换或高亮显示。
- **多语言支持**:确保正则表达式能够正确处理不同语言的话题标签,包括中文等非ASCII字符。
---
阅读全文
相关推荐

















