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

SwiftUI实现文本部分可点击:列表中手机号/URL点击方案咨询

实现SwiftUI列表文本中手机号和URL的可点击功能

当然可以实现这个需求!在SwiftUI中,我们可以利用AttributedString来识别文本中的特殊内容(手机号、URL),并将它们转换为可交互的点击元素。下面是针对你的代码修改后的完整解决方案:

完整实现代码

import SwiftUI
import UIKit // 需导入UIKit以使用UIApplication

struct ContentView: View {
    @State var itemList : [Item] = [Item]()
    
    var body: some View {
        VStack{
            List(itemList){ item in
                // 使用处理后的富文本
                Text(makeClickableAttributedString(from: item.info))
                    .onOpenURL { url in
                        // 响应不同类型的链接点击
                        switch url.scheme {
                        case "tel":
                            // 唤起电话应用
                            UIApplication.shared.open(url)
                        case "http", "https":
                            // 唤起浏览器打开网页
                            UIApplication.shared.open(url)
                        default:
                            break
                        }
                    }
            }
            Text("Hello, World!")
        }.onAppear(perform: {
            print("test")
            itemList = [Item(info: "testing"), 
                        Item(info: "Contact me 0123456789"), 
                        Item(info: "Check our website https://google.com")]
        })
    }
    
    // 核心函数:将普通文本转换为包含可点击链接的富文本
    private func makeClickableAttributedString(from text: String) -> AttributedString {
        var attributedString = AttributedString(text)
        
        // 1. 匹配并处理URL
        let urlPattern = #"(https?://\S+)"#
        if let urlRegex = try? NSRegularExpression(pattern: urlPattern) {
            let matches = urlRegex.matches(in: text, range: NSRange(text.startIndex..., in: text))
            for match in matches {
                if let range = Range(match.range, in: text) {
                    attributedString[range].link = URL(string: String(text[range]))
                    attributedString[range].foregroundColor = .blue
                    attributedString[range].underlineStyle = .single
                }
            }
        }
        
        // 2. 匹配并处理手机号(这里用10位数字的正则,可根据需求调整)
        let phonePattern = #"\b\d{10}\b"#
        if let phoneRegex = try? NSRegularExpression(pattern: phonePattern) {
            let matches = phoneRegex.matches(in: text, range: NSRange(text.startIndex..., in: text))
            for match in matches {
                if let range = Range(match.range, in: text) {
                    attributedString[range].link = URL(string: "tel://\(text[range])")
                    attributedString[range].foregroundColor = .blue
                    attributedString[range].underlineStyle = .single
                }
            }
        }
        
        return attributedString
    }
}

struct Item: Identifiable {
    var info : String
    let id = UUID()
    func load() { }
}

关键说明

  • AttributedString的作用:它允许我们为文本的特定片段添加样式(颜色、下划线)和交互属性(链接),这是实现可点击文本的核心。
  • 正则匹配逻辑:
    • URL匹配使用https?://\S+,可以识别以http/https开头的链接;
    • 手机号匹配用\b\d{10}\b,你可以根据实际的手机号格式(比如带区号、分隔符)修改正则表达式。
  • 点击事件处理:通过.onOpenURL修饰符捕获链接点击,区分tel协议(手机号)和http/https协议(网页),分别唤起对应的系统应用。

这样修改后,你的列表项中只要包含符合规则的手机号或URL,就会自动变成蓝色带下划线的可点击元素,点击后会执行对应的动作~

内容的提问来源于stack exchange,提问作者Oxford212

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:24:06