SwiftUI 的 Text 控件如何实现自定义 URL Actions

2,056 阅读3分钟

前言

在 iOS 15 发布后,Apple 官方为 SwiftUI 中的 Text 控件提供了 markdown 语法的原生支持。这项特性使得开发人员能够轻松创建带有超链接的字符串,这些超链接可以打开网站、发送电子邮件或拨打电话等。

虽然这个特性应对大多数的需求已经足够了,但在某些情况下,开发人员可能希望对点击链接时发生的事情有更多的控制。

在本文中,我将展示如何在 SwiftUI 中更好地控制链接行为。此外,还将分享一些实用的自定义 URL action 用例,希望它们会对大家的是有帮助的。

废话不多说,让我们开始吧!

使用 environment 的 openURL 修饰符

在 iOS 15的版本中,Apple 官方引入了环境视图的 openURL 修饰符,以便 Text 控件对 markdown 的原生支持。这个修饰符允许开发人员定义点击链接时将发生的操作。它可以通过将其附加到 Text 控件中轻松使用,示例代码如下:

Text("如需查看更多,请点击[此处](https://www.apple.com)")
	.environment(\.openURL, OpenURLAction { url in
	    // 进行自定义的处理
	    return .systemAction
    })

需要注意的是,在 action handler 的最后,我们需要返回此次 action 的结果。这确保了系统知道自定义操作的最终结果。

如果你想了解可用的 action 结果,这里是所有选项的列表:

  • handled:表示该 handler 已经打开了 URL。
  • discarded:表示该 handler 丢弃了 URL。
  • systemAction:表示要求 SwiftUI 使用系统的 handler 打开 URL。
  • systemAction(_:):表示要求 SwiftUI 使用系统处理程序打开指定的 URL。

现在,你已经了解了 openURL 环境视图修饰符是如何工作的,接下来让我们看一下它的一些实用的用例。

对超链接点击的数据统计

平常开发中,我们经常会碰到需要数据分析的需求。比如对某些链接点击次数的统计,就可以在 openURL 修饰符中处理类似的逻辑:

Text("""
     - [汉堡](https://www.hamburg.com)
     - [炸鸡](https://www.chicken.com)
     - [牛排](https://www.steak.com)
     """)
    .environment(\.openURL, OpenURLAction { url in
        print("点击了\(url)") // 数据统计
        return .systemAction
    })

需要注意的是:在完成跟踪之后,我们不要去修改系统的默认行为。为了实现这一点,我们可以返回 . systemaction 作为操作结果。这确保系统将通过在默认浏览器中打开 URL 来继续。

点击文字变色

除了正常的 URL 交互,我们还可以使用修饰符来执行类似于按钮的操作。示例代码如下:

Text("Choose text color: [Red](FF0000), [Green](00FF00), [Blue](0000FF)")
    .environment(\.openURL, OpenURLAction { url in
        withAnimation {
            textColor = Color(hex: url.absoluteString)
        }
        return .handled
    })
    .foregroundColor(textColor)

效果图如下:

custom-url-action-change-colors-2.webp

正如上图所展示的,markdown URL语法不仅限于处理 URL。我们可以给它任何字符串并把它传递给action handler。在上面的例子中,我们传入颜色十六进制代码,用来实现上图的效果。