如何使用 Swift 创建“超链接”?

Posted

技术标签:

【中文标题】如何使用 Swift 创建“超链接”?【英文标题】:How can I create a "hyperlink" with Swift? 【发布时间】:2014-08-25 00:22:03 【问题描述】:

我正在尝试使单独的文本 UILabels 可点击。我正在寻找的东西通常称为 Web 开发中的超链接。

<a href="//example.com">Link 1</a>
<a href="//example.com/example">Link 2</a>
<a href="//example.com/other_example">Link 3</a>

每个a 标签都是它自己的UILabel,当点击标签之间的文本时,它会理想地打开Safari 到指定的href

我找到了一堆关于如何在 Objective-C 中做这类事情的资源,但它们似乎都不必要地复杂,并且不能很好地转换为 Swift(它们符合 Objective-C 的组织结构不能在 Swift 中很好地工作,并且违背了推荐的语言使用方式)。

这里有几个:

How to add hyperlink in iPhone app? How to make a clickable link inside a NSTextField and Cocoa Text as Hyperlink in Objective-C

如果我有 3 个UILabels,

项目 1

第 2 项

第 3 项

那么让每个项目在 Safari 中打开到不同 URL 的最佳“Swift-y”方式是什么?

我可以为每个按钮创建单独的按钮,但 UILabels 是通过编程方式填充的,所以我认为让文本响应点击可能是一个更好的选择。

【问题讨论】:

在 UILabel 中包含多个 URL 在任何一种语言中都有些棘手。您将需要检测标签矩形中的点击,然后尝试找出触摸了哪条线。使用多个 UILabel 会简单得多,因为您只需要一个简单的 touchUpInside 处理程序 @Paulw11 好的:我会试试的。你介意用那个场景写一个答案吗?我将更改我的问题以反映不同的结构。 【参考方案1】:

斯威夫特 3 我在 github 中创建了一个 LinkUILabel 类: https://github.com/jorgecsan/LinkUILabel 有了这个,您只需要添加可检查的 url,如图所示: 或以编程方式分配 url 变量:

linkUILabel.url = "www.example.com"

如果你想自己实现,我也找到了解决方案!:)

使用:

// This is the label
@IBOutlet weak var label: UILabel!

override func loadView() 
    super.loadView()

    // This is the key
    let tap = UITapGestureRecognizer(target: self, action: #selector(self.onClicLabel(sender:)))
    label.isUserInteractionEnabled = true
    label.addGestureRecognizer(tap)


// And that's the function :)
func onClicLabel(sender:UITapGestureRecognizer) 
    openUrl("http://www.google.com")



func openUrl(urlString:String!) 
    let url = URL(string: urlString)!
    if #available(ios 10.0, *) 
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
     else 
        UIApplication.shared.openURL(url)
    

希望对你有帮助!:)

【讨论】:

【参考方案2】:

一种方法类似于以下内容。 假设是:

self.urls 是一个字符串数组,包含与每个UILabel 关联的url。 每个UILabel tag 都已设置为数组中的相应索引 labelTapped: 设置为标签的 touchUpInside 处理程序。
import Foundation
import UIKit

class urltest 

    var urls:[String]

    init() 
        self.urls=[String]()  // Load URLs into here
    

    @IBAction func labelTapped(sender:UILabel!) 

        let urlIndex=sender.tag;
        if (urlIndex >= 0 && urlIndex < self.urls.count) 
           self.openUrl(self.urls[urlIndex]);
        

    

    func openUrl(url:String!) 

        let targetURL=NSURL.URLWithString(url)

        let application=UIApplication.sharedApplication()

        application.openURL(targetURL);

    

【讨论】:

在我看来你复制了按钮的功能。 那么,出于好奇,我不得不问,为什么?按钮只是一段文本,当您点击它时会调用一个动作。这正是您所要求的。 @TimQuinn 这里的问题是打开 Safari 而不是调用操作:这些是 UILabels,这就是为什么我要求使用它们的解决方案。我可以使用一个按钮,但如果唯一的区别是向标签添加一个修饰处理程序,为什么要更改它呢? @TimQuinn 实际上我确实最终制作了按钮,因为它们的本地处理方式比 UILabels 的方式更适合它。最初我犹豫不决,因为我的意图是制作类似于列表的东西,但按钮与标签足够相似,可以解决。【参考方案3】:

通过 UITextView 的超链接

var termsConditionsTextView: UITextView = 
let view = UITextView()
 view.backgroundColor = .clear
 view.textAlignment = .left
 
 let firstTitleString = "By registering for THIS_APP I agree with the "
 let secondTitleString = "Terms & Conditions"
 let finishTitleString = firstTitleString + secondTitleString
 let attributedString = NSMutableAttributedString(string: finishTitleString)
 attributedString.addAttribute(.link, value: "https://***.com", range: NSRange(location: firstTitleString.count, length: secondTitleString.count))
 
 view.attributedText = attributedString
 view.textContainerInset = .zero
 view.linkTextAttributes = [
     .foregroundColor: UIColor.blue,
     .underlineStyle: NSUnderlineStyle.single.isEmpty
 ]
 
 view.font = view.font = UIFont(name: "YOUR_FONT_NAME", size: 16)
 view.textColor = UIColor.black
 
 return view ()

【讨论】:

以上是关于如何使用 Swift 创建“超链接”?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将文本作为NSTextView中的超链接? Swift 4,Xcode 9.4

如何使用公式在单元格文本中间创建超链接?

如何创建一个仅在 chrome 中打开并使用禁用标志的超链接

如何从 Swift 中的 UITextView 获取链接范围

jquery如何进行超链接

使用 KendoUI Charts,如何使 Legend 项成为超链接?