如何在 SwiftUI 中创建可点击的 url/phone 数字
How to create tappable url/phone number in SwiftUI
我想在 SwiftUI 文本(或任何视图)中显示一个 phone 数字,然后使其可点击,以便打开 'Phone'。
有没有办法用 SwiftUI 做到这一点,或者我应该尝试在 SwiftUI 中包装一个 UITextView,然后用老式的方法用 NSAttributed 字符串等来做?
我已阅读 SwiftUI 中文本的文档,但找不到有关如何执行此操作的任何信息。目前正尝试在 Xcode 11 beta 5 中执行此操作。
我在 SwiftUI.h
的 SwiftUI API 中搜索了 'text'
我还用 "make phone number/url tappable"、"Tappable link/url swiftUI" 等查询搜索了 Whosebug [swiftui] 和 google。
Text("123-456-7890")
.onTapGesture {
// do something here
}
(文本将是日语 phone 数字)
通过动作使其成为 Button()
,而不是通过手势成为 Text()
。
试试这个,
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 的回答,我找到了解决此问题所需的必要代码:
在 Button 的 里面 中 - 你需要调用这个方法:
UIApplication.shared.open(url)
实际进行 phone 调用/在 SwiftUI 视图中打开 link。
当然,一开始我不明白如何格式化我的 phone 号码,我在这些答案中找到了:
How to use openURL for making a phone call in Swift?
不要忘记将 'tel://' 添加到 string/format 的开头,如 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")!)}
从iOS14开始,Apple默认为我们提供了Link视图。所以,你可以只使用这个,
Link("Anyone can learn Swift", destination: URL(string: "https://ohmyswift.com")!)
iOS以前的版本,比如iOS13.0,还是要用
Button("Anyone can learn Swift") {
UIApplication.shared.open(URL(string: "https://ohmyswift.com")!)
}
使用 iOS 14 / Xcode 12.0 beta 5
使用 SwiftUI 中的新 link 功能 phone 和电子邮件 links。
// 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
如果您想使用视图,我会添加这个。
点击视图拨打电话
Link(destination: URL(string: "tel:1234567890")!, label: {
SomeView()
})
点击字符串拨打电话
Link("1234567890", destination: URL(string: "tel:1234567890")!)
Button {
var cleanNum = selectedItem.phoneNum
let charsToRemove: Set<Character> = [" ", "(", ")", "-"] // "+" can stay
cleanNum.removeAll(where: { charsToRemove.contains([=10=]) })
guard let phoneURL = URL(string: "tel://\(cleanNum)") else { return }
UIApplication.shared.open(phoneURL, options: [:], completionHandler: nil)
} label: {
// ...
}
iOS 15(测试版)
利用支持链接的 SwiftUI 中的 Markdown!
struct ContentView: View {
var body: some View {
Text("Call [123-456-7890](tel:1234567890)")
}
}
结果:
如果您需要在点击 link 时记录任何事件,您也可以这样做:
struct exampleView: View {
@SwiftUI.Environment(\.openURL) private var openURL
var body: some View {
Button {
if let url = URL(string: "https://www.google.com") {
openURL(url)
}
} label: {
Text("Link")
.foregroundColor(Color("EyrusDarkBlue"))
}
}
}
我想在 SwiftUI 文本(或任何视图)中显示一个 phone 数字,然后使其可点击,以便打开 'Phone'。
有没有办法用 SwiftUI 做到这一点,或者我应该尝试在 SwiftUI 中包装一个 UITextView,然后用老式的方法用 NSAttributed 字符串等来做?
我已阅读 SwiftUI 中文本的文档,但找不到有关如何执行此操作的任何信息。目前正尝试在 Xcode 11 beta 5 中执行此操作。
我在 SwiftUI.h
的 SwiftUI API 中搜索了 'text'我还用 "make phone number/url tappable"、"Tappable link/url swiftUI" 等查询搜索了 Whosebug [swiftui] 和 google。
Text("123-456-7890")
.onTapGesture {
// do something here
}
(文本将是日语 phone 数字)
通过动作使其成为 Button()
,而不是通过手势成为 Text()
。
试试这个,
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 的回答,我找到了解决此问题所需的必要代码:
在 Button 的 里面 中 - 你需要调用这个方法:
UIApplication.shared.open(url)
实际进行 phone 调用/在 SwiftUI 视图中打开 link。
当然,一开始我不明白如何格式化我的 phone 号码,我在这些答案中找到了:
How to use openURL for making a phone call in Swift?
不要忘记将 'tel://' 添加到 string/format 的开头,如 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")!)}
从iOS14开始,Apple默认为我们提供了Link视图。所以,你可以只使用这个,
Link("Anyone can learn Swift", destination: URL(string: "https://ohmyswift.com")!)
iOS以前的版本,比如iOS13.0,还是要用
Button("Anyone can learn Swift") {
UIApplication.shared.open(URL(string: "https://ohmyswift.com")!)
}
使用 iOS 14 / Xcode 12.0 beta 5
使用 SwiftUI 中的新 link 功能 phone 和电子邮件 links。
// 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
如果您想使用视图,我会添加这个。
点击视图拨打电话
Link(destination: URL(string: "tel:1234567890")!, label: {
SomeView()
})
点击字符串拨打电话
Link("1234567890", destination: URL(string: "tel:1234567890")!)
Button {
var cleanNum = selectedItem.phoneNum
let charsToRemove: Set<Character> = [" ", "(", ")", "-"] // "+" can stay
cleanNum.removeAll(where: { charsToRemove.contains([=10=]) })
guard let phoneURL = URL(string: "tel://\(cleanNum)") else { return }
UIApplication.shared.open(phoneURL, options: [:], completionHandler: nil)
} label: {
// ...
}
iOS 15(测试版)
利用支持链接的 SwiftUI 中的 Markdown!
struct ContentView: View {
var body: some View {
Text("Call [123-456-7890](tel:1234567890)")
}
}
结果:
如果您需要在点击 link 时记录任何事件,您也可以这样做:
struct exampleView: View {
@SwiftUI.Environment(\.openURL) private var openURL
var body: some View {
Button {
if let url = URL(string: "https://www.google.com") {
openURL(url)
}
} label: {
Text("Link")
.foregroundColor(Color("EyrusDarkBlue"))
}
}
}