Adam
Adam

Reputation: 325

Swift ios NSAttributedString Link in TableView not work

extension String {    
    func accentTagAndLink(tags:Array<String>) -> NSMutableAttributedString {

        let attributedString:NSMutableAttributedString = NSMutableAttributedString(string: self)
        var NSContents = self as NSString

        for tagChild in tags {
            if !tagChild.starts(with: "<") {
                let range = NSContents.range(of: "#" + tagChild)
                var changeString = ""

                for _ in 0..<tagChild.count {
                    changeString += "$"
                }

                NSContents = NSContents.replacingOccurrences(of: tagChild, with: changeString, options: .literal, range: range) as NSString
                attributedString.addAttribute(.link, value: tagChild, range: range)
                attributedString.addAttribute(.foregroundColor, value: UIColor(red: 79/255, green: 205/255, blue: 255/255, alpha: 1), range: range)
            }
        }

        return attributedString
    }
}

tableviewCell

class PostCell: TableViewCell {
    @IBOutlet weak var postContent: UITextView!
}

in mainViewController

class PostViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,UITextViewDelegate {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = postTableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell
        let post = postList[indexPath.row]
        let tags = (post["Content"] as! String).FindTagAtString()
        cell.postContent.delegate = self
        cell.postContent.isSelectable = true
        cell.postContent.isEditable = false
        cell.postContent.dataDetectorTypes = UIDataDetectorTypes.link
        cell.postContent.attributedText = (post["Content"] as! String).accentTagAndLink(tags: tags)
    }

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
        print("link")
        return true
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("cell")
    }
}

NSLink in UITextView in TableViewCell

i want tap Link event return "link"

but only call TableViewCell Tab event

always return "cell"

Tell us how to use this i don't know

TTTAttributedLabel is worked but crash my code

so make it self Tap link

Is the usage of AttributedString wrong?

help

Upvotes: 0

Views: 890

Answers (1)

potato
potato

Reputation: 333

Important

Links in text views are interactive only if the text view is selectable but noneditable. That is, if the value of the UITextView the selectable property is YES and the isEditable property is NO.

I think you forgot to set isEditable to false.
Apple Doc

Upvotes: 1

Related Questions