gpt4 book ai didi

ios - 使用 URL 在 Swift 中显示电话号码的所有系统选项

转载 作者:行者123 更新时间:2023-12-01 21:27:58 34 4
gpt4 key购买 nike

Swift 有一个名为 UITextView 的类,它有一个名为 dataDetectorTypes 的属性它将自动扫描文本以查找指定的数据类型(如电话号码、 map 位置等),突出显示找到的事件,并提供用户交互选项。我目前正在将我的应用程序转换为使用 SwiftUI,并且正在努力重新实现数据检测器的特定行为。也就是说,当一个电话号码被点击时,它会提供调用选项,但是当强制触摸(或者我假设长按)时,它会提供来自整个系统的多个选项,从第一方消息应用程序到第三方应用程序。以下两张图片显示了我所指的内容:
点击通话选项
Call option on tap
强制触摸的系统范围选项
System wide options on force touch
我试过包装 UITextViewUIViewRepresentable 内,这在大多数情况下都有效,但它很丑陋,并且与应用程序的其余部分集成有点棘手。毕竟,按照我使用它的方式,并不需要 UITextView 的所有功能。 .它实际上只是一个带有链接的按钮。
我不确定要使用什么 SwiftUI 元素,但给出了以下注意事项:

  • Text : 虽然我不认为这可以处理用户交互
  • Link :这可能是相关的,但意味着我需要将最低要求设置为 iOS 14
  • Button : 这个选项似乎最有希望。使用其他 SO 答案,我有这样的事情:
  • Button("Click Me") {
    guard let url = URL(string: "telprompt://\(self.phoneString)"),
    UIApplication.shared.canOpenURL(url) else { return }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }.foregroundColor(.blue)
    然而,这只实现了第一个行为,即点击调用的选项,而不是第二个行为。有没有办法在 Swift 中编写电话 URL 以打开多个系统生成的选项?或者我应该做一些不同的事情,使用不同的 Xcode 函数?

    最佳答案

    AFAIK,无法以编程方式访问该系统操作表。您可能会尝试一个一个地复制所有按钮,但老实说,我只会使用 UITextView包裹在 UIViewRepresentable .
    你有什么问题?我遇到了一些布局问题,使用 SwiftUI Text 解决了这些问题作为模板查看。
    下面是我正在使用的类(class)。它检测所有类型的数据,但您可以轻松修改它以仅检测电话号码。

    struct DataDetectorText: View {
    let text: String

    init(_ text: String) {
    self.text = text
    }

    var body: some View {
    Text(text + "\n")
    .fixedSize(horizontal: false, vertical: true)
    .hidden()
    .overlay(DataDetectorTextView(text: text))
    }
    }

    private struct DataDetectorTextView: UIViewRepresentable {
    let text: String

    func makeUIView(context _: Context) -> UITextView {
    let view = UITextView()

    view.text = text
    view.font = UIFont.preferredFont(forTextStyle: .body)

    view.dataDetectorTypes = [.all]
    view.isEditable = false
    view.isSelectable = true

    view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    view.isScrollEnabled = false
    view.textContainer.lineFragmentPadding = 0
    return view
    }

    func updateUIView(_ uiView: UITextView, context _: Context) {
    uiView.text = text
    uiView.sizeToFit()
    }
    }

    关于ios - 使用 URL 在 Swift 中显示电话号码的所有系统选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63258385/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com