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

4

我正在尝试让单独的文本片段成为可点击的 UILabel。在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>

每个标签都是一个独立的UILabel,当标签之间的文本被单击时,它理应打开指定的href页面。
我发现了许多关于如何在Objective-C中完成这种操作的资源,但它们似乎都过于复杂,并且无法很好地转化到Swift上(它们适用于Objective-C的组织结构,在Swift中并不适用,也不符合该语言的推荐使用方式)。
以下是其中的一些:
如果我有3个UILabels

项目1

项目2

项目3

那么使每个项目打开不同的URL,最好的“Swift-y”方法是什么?
我可以为每个项目创建单独的按钮,但是UILabels是以编程方式填充的,所以我认为使文本响应点击可能是更好的选择。

在UILabel中使用多个URL在任何语言中都有些棘手。您需要检测标签矩形中的点击,然后尝试确定触摸了哪一行。如果使用多个UILabel,则会更简单,因为您只需要一个简单的touchUpInside处理程序即可。 - Paulw11
@Paulw11 好的:我会尝试一下。您介意使用该场景编写答案吗?我将更改我的问题以反映不同的结构。 - AstroCB
3个回答

7

Swift 3 我在github上创建了一个LinkUILabel类: https://github.com/jorgecsan/LinkUILabel 使用它,您只需要将inspectable的url添加到标签中即可,就像图像所示: Example label with 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)
    }
}

希望能帮到你!:)

5

一种方法是按照以下方式进行。

假设:

  • self.urls 是一个包含与每个UILabel相关联的URL的字符串数组。
  • 每个UILabeltag已设置为相应的索引。
  • 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);

    }
}

2
看起来你复制了一个按钮的功能。 - Tim Quinn
那么我很好奇地问一下,为什么呢?一个按钮只是一个文本块,当你点击它时调用一个动作。这正是你所要求的。 - Tim Quinn
@TimQuinn 这里的问题更多是打开Safari而不是调用操作: 这些是UILabel,这就是为什么我要求使用它们的解决方案。我可以使用按钮,但如果唯一的区别是在标签中添加touchup处理程序,为什么要改变呢? - AstroCB
@TimQuinn 我最终确实将它们制作成了按钮,因为原生处理方式更适合按钮而不是UILabel的方式。我最初有些犹豫,因为我的意图是要有类似列表的东西,但按钮与标签足够相似,可以解决问题。 - AstroCB

1

通过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://stackoverflow.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 }()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接