前言

在 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)

作用图如下:

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