I want to make a UILabel
with some text with a click-able links in it. Not links to webpages but to actions like I do with an UIButton
. So I used TTTAttributedLabel
which is working perfectly with Objective C
. Now I want to do the same in Swift
, so I wrote the below code:
self.someLabel.text = NSLocalizedString("Lost? Learn more.", comment: "")
let range = self.someLabel.text!.rangeOfString(NSLocalizedString("Learn more", comment:""))
self.someLabel.addLinkToURL (NSURL(string:"action://Learn more"), withRange:NSRange (range))
However, I cannot make the link work in Swift
. I am getting the error: “Missing argument for parameter 'host' in call”
for the last line.
TTTAttributedLabel lable in swift 4.2
import TTTAttributedLabel
@IBOutlet weak var attributedLable: TTTAttributedLabel!
override func viewDidLoad() {
super.viewDidLoad()
self.setup()
}
func setup(){
attributedLable.numberOfLines = 0;
let strTC = "terms and conditions"
let strPP = "privacy policy"
let string = "By signing up or logging in, you agree to our \(strTC) and \(strPP)"
let nsString = string as NSString
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.2
let fullAttributedString = NSAttributedString(string:string, attributes: [
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.foregroundColor: UIColor.black.cgColor,
])
attributedLable.textAlignment = .center
attributedLable.attributedText = fullAttributedString;
let rangeTC = nsString.range(of: strTC)
let rangePP = nsString.range(of: strPP)
let ppLinkAttributes: [String: Any] = [
NSAttributedString.Key.foregroundColor.rawValue: UIColor.blue.cgColor,
NSAttributedString.Key.underlineStyle.rawValue: false,
]
let ppActiveLinkAttributes: [String: Any] = [
NSAttributedString.Key.foregroundColor.rawValue: UIColor.blue.cgColor,
NSAttributedString.Key.underlineStyle.rawValue: false,
]
attributedLable.activeLinkAttributes = ppActiveLinkAttributes
attributedLable.linkAttributes = ppLinkAttributes
let urlTC = URL(string: "action://TC")!
let urlPP = URL(string: "action://PP")!
attributedLable.addLink(to: urlTC, with: rangeTC)
attributedLable.addLink(to: urlPP, with: rangePP)
attributedLable.textColor = UIColor.black;
attributedLable.delegate = self;
}
func attributedLabel(_ label: TTTAttributedLabel!, didSelectLinkWith url: URL!) {
if url.absoluteString == "action://TC" {
print("TC click")
}
else if url.absoluteString == "action://PP" {
print("PP click")
}
}
Out put is look like below screenshot
String.rangeOfString
returns Range
, but NSString.rangeOfString
returns NSRange
. So the following code should work:
let name = "tomo"
let string = "My name is \(name)"
label.text = string
let nsString = string as NSString
let range = nsString.rangeOfString(name)
let url = NSURL(string: "action://users/\(name)")!
label.addLinkToURL(url, withRange: range)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With