【问题标题】:How to create tappable url/phone number in SwiftUI如何在 SwiftUI 中创建可点击的 url/电话号码
【发布时间】:2019-12-26 04:52:18
【问题描述】:

我想在 SwiftUI 文本(或任何视图)中显示电话号码,然后使其可点击以便打开“电话”。

有没有办法用 SwiftUI 做到这一点,或者我应该尝试在 SwiftUI 中包装一个 UITextView 并用 NSAttributed 字符串等老式方式来做?

我已阅读 SwiftUI 中的 Text 文档,但找不到任何有关如何执行此操作的信息。目前正尝试在 Xcode 11 beta 5 中执行此操作。

我在 SwiftUI.h 的 SwiftUI API 中搜索了“文本”

我还搜索了 stackoverflow [swiftui] 和 google 的查询,例如“使电话号码/url 可点击”、“可点击的链接/url swiftUI”等。

Text("123-456-7890")
    .onTapGesture {
    // do something here
}

(文本将是日本电话号码)

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    将其设为带有动作的Button(),而不是带有手势的Text()

    【讨论】:

    • 要在没有适当事实支持的情况下发表声明,我想知道您为什么建议这样做。我并不是说这不是一个有效的答案,但我有一个带有点击手势的文本字段,我的工作正常。
    【解决方案2】:

    试试这个,

    let strNumber = "123-456-7890"
    
    Button(action: {
        let tel = "tel://"
        let formattedString = tel + strNumber 
        guard let url = URL(string: formattedString) else { return }
        UIApplication.shared.open(url) 
       }) {
       Text("123-456-7890")
    }
    

    【讨论】:

    • 我更新了我的问题。这是一个好的开始,您的回答让我自己弄清楚了,但它没有包含我需要的重要信息。
    • 有没有不占全屏的通话方式
    【解决方案3】:

    感谢 Ashish 的回答,我找到了解决此问题所需的必要代码:

    在Button的inside动作中——你需要调用这个方法:

    UIApplication.shared.open(url)
    

    实际拨打电话/在 SwiftUI 视图中打开链接。

    当然,我一开始不明白如何格式化我的电话号码,我在这些答案中找到了:

    How to use openURL for making a phone call in Swift?

    不要忘记将“tel://”添加到字符串的开头/将其格式化为 URL..

    有效的完整代码是

    Button(action: {
    
        // validation of phone number not included
        let dash = CharacterSet(charactersIn: "-")
    
        let cleanString =     
        hotel.phoneNumber!.trimmingCharacters(in: dash)
    
        let tel = "tel://"
        var formattedString = tel + cleanString
        let url: NSURL = URL(string: formattedString)! as NSURL
    
        UIApplication.shared.open(url as URL)
    
    }) {
    Text(verbatim: hotel.phoneNumber!)
    }
    

    【讨论】:

    • 要使用 UIApplication 你需要导入 UIKit。有没有办法在没有 UIKit 的情况下打开外部 url?
    • 至少对我来说,这段代码在没有任何“import UIkit”语句的情况下工作。
    【解决方案4】:

    亲吻答案:

    Button("url") {UIApplication.shared.open(URL(string: "https://google.com")!)}
    

    【讨论】:

      【解决方案5】:

      从 iOS 14 开始,Apple 默认为我们提供了一个链接视图。所以,你可以用这个,

      Link("Anyone can learn Swift", destination: URL(string: "https://ohmyswift.com")!)
      

      对于iOS之前的版本,比如iOS 13.0,还是要使用

      Button("Anyone can learn Swift") {
         UIApplication.shared.open(URL(string: "https://ohmyswift.com")!)
      }
       
      

      【讨论】:

      • 有什么方法可以像联系人应用一样使用链接?即当您长按电话号码或地址时,它会主动为您复制?
      【解决方案6】:

      使用 iOS 14 / Xcode 12.0 beta 5

      在 SwiftUI 中为电话和电子邮件链接使用新的链接功能。

          // Link that will open Safari on iOS devices
          Link("Apple", destination: URL(string: "https://www.apple.com")!)
          
          //  Clickable telphone number
          Link("(800)555-1212", destination: URL(string: "tel:8005551212")!)
      
          //  Clickable Email Address
          Link("apple@me.com", destination: URL(string: "mailto:apple@me.com")!)
          
      

      【讨论】:

      • 是的 iOS 14!这行得通。有没有短信链接选项?
      • 找到了我的问题的答案:Link("(123) 555-1212", destination: URL(string: "imessage:1235551212")!)
      【解决方案7】:

      使用 iOS 14 / Xcode 12.5
      如果您想使用视图,我会添加它。

      通过点击视图拨打电话

      Link(destination: URL(string: "tel:1234567890")!, label: {
        SomeView()
      })
      

      点击字符串拨打电话

      Link("1234567890", destination: URL(string: "tel:1234567890")!)
      

      【讨论】:

        【解决方案8】:
        Button {
        
          var cleanNum = selectedItem.phoneNum
          let charsToRemove: Set<Character> = [" ", "(", ")", "-"] // "+" can stay
          cleanNum.removeAll(where: { charsToRemove.contains($0) })
          
          guard let phoneURL = URL(string: "tel://\(cleanNum)") else { return }
          UIApplication.shared.open(phoneURL, options: [:], completionHandler: nil)
        
        } label: {
          // ...
        }
        

        【讨论】:

          【解决方案9】:

          iOS 15(测试版)

          利用支持链接的 SwiftUI 中的 Markdown!

          struct ContentView: View {
              var body: some View {
                  Text("Call [123-456-7890](tel:1234567890)")
              }
          }
          

          结果:

          【讨论】:

          • 这在使用 LocalizedStrings 时似乎不起作用...
          猜你喜欢
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 2014-02-24
          • 1970-01-01
          相关资源
          最近更新 更多