如何在SwiftUI中创建可点击的url/电话号码

如何在SwiftUI中创建可点击的url/电话号码,swiftui,Swiftui,我想在SwiftUI文本(或任何视图)中显示一个电话号码,然后使其可单击,这样它将打开“电话” 有没有一种方法可以用SwiftUI实现这一点,或者我应该尝试用SwiftUI包装UITextView,并用NSAttribute字符串等老式方法实现这一点 我已经阅读了SwiftUI中的文本文档,但找不到任何关于如何执行此操作的信息。目前正在Xcode 11 beta 5中尝试这样做 我在SwiftUI.h中搜索了swiftuiapi中的“text” 我还搜索了stackoverflow[swiftu

我想在SwiftUI文本(或任何视图)中显示一个电话号码,然后使其可单击,这样它将打开“电话”

有没有一种方法可以用SwiftUI实现这一点,或者我应该尝试用SwiftUI包装UITextView,并用NSAttribute字符串等老式方法实现这一点

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

我在SwiftUI.h中搜索了swiftuiapi中的“text”

我还搜索了stackoverflow[swiftui]和google,搜索内容包括“使电话号码/url可点击”、“可点击链接/url swiftui”等

Text(“123-456-7890”)
.ontapsigne{
//在这里做点什么
}
(文本将是日文电话号码)

将其设置为带有动作的
按钮()
,而不是带有手势的
文本()

试试这个

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")
}

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

在按钮内部的操作中-您需要调用此方法:

UIApplication.shared.open(url)
在SwiftUI视图中实际拨打电话/打开链接

当然,一开始我不知道如何格式化我的电话号码,我在这些答案中发现:

别忘了在字符串开头添加“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!)
}
接吻回答:

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

在iOS 14中,苹果默认为我们提供了一个链接视图。所以,你可以用这个

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")!)
}
 

使用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/Xcode 12.5
如果您想使用视图,我会添加此选项

通过点击视图拨打电话 通过轻敲字符串来打电话
按钮{
var cleanNum=selectedItem.phoneNum
让charsToRemove:Set=[“”,“(“,”),“-”]/“+”可以保留
cleanNum.removeAll(其中:{charsToRemove.contains($0)})
guard let phoneURL=URL(字符串:“tel://\(cleanNum)”)else{return}
UIApplication.shared.open(phoneURL,选项:[:],completionHandler:nil)
}标签:{
// ...
}
iOS 15(测试版) 利用SwiftUI中的降价功能,它支持链接

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


我更新了我的问题。这是一个很好的开始,你的回答让我自己弄清楚了,但它没有包括我需要的重要信息。有没有一种方法可以在不占用整个屏幕的情况下调用UIKit来使用你需要导入的UIKit应用程序。有没有一种方法可以在没有UIKit的情况下打开外部url?这段代码至少可以在没有任何“import UIKit”语句的情况下运行。如果要在没有适当事实支持的情况下创建一个语句,我想知道你为什么会这样建议。我并不是说这不是一个有效的答案,但我有一个带有轻触手势的文本字段,我的文本字段可以正常工作。有没有办法像contacts应用程序那样使用链接?i、 e.当你长按电话号码或地址时,它会主动为你复制它?耶,iOS 14!这很有效。有文本消息链接选项吗?找到了我问题的答案:链接(“(123)555-1212”,目的地:URL(字符串:“imessage:1235551212”)!)
Link("1234567890", destination: URL(string: "tel:1234567890")!)
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: {
  // ...
}
struct ContentView: View {
    var body: some View {
        Text("Call [123-456-7890](tel:1234567890)")
    }
}