如何使用 Swift 创建“超链接”?
Posted
技术标签:
【中文标题】如何使用 Swift 创建“超链接”?【英文标题】:How can I create a "hyperlink" with Swift? 【发布时间】:2014-08-25 00:22:03 【问题描述】:我正在尝试使单独的文本 UILabel
s 可点击。我正在寻找的东西通常称为 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 个UILabel
s,
项目 1
第 2 项
第 3 项
那么让每个项目在 Safari 中打开到不同 URL 的最佳“Swift-y”方式是什么?
我可以为每个按钮创建单独的按钮,但 UILabel
s 是通过编程方式填充的,所以我认为让文本响应点击可能是一个更好的选择。
【问题讨论】:
在 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 而不是调用操作:这些是UILabel
s,这就是为什么我要求使用它们的解决方案。我可以使用一个按钮,但如果唯一的区别是向标签添加一个修饰处理程序,为什么要更改它呢?
@TimQuinn 实际上我确实最终制作了按钮,因为它们的本地处理方式比 UILabel
s 的方式更适合它。最初我犹豫不决,因为我的意图是制作类似于列表的东西,但按钮与标签足够相似,可以解决。【参考方案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 中打开并使用禁用标志的超链接