如何在Swift iOS中同时使用UITableView和NSLink?

如何在Swift iOS中同时使用UITableView和NSLink?,ios,swift,uitableview,uitextview,tttattributedlabel,Ios,Swift,Uitableview,Uitextview,Tttattributedlabel,分机代码: 在主视图控制器中 class PostViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,UITextViewDelegate { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = pos

分机代码:

在主视图控制器中

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.isUserInteractionEnabled = true
        cell.postContent.dataDetectorTypes = UIDataDetectorTypes.link
        cell.postContent.attributedText = (post["Content"] as! String).accentTagAndLink(tags: tags)
        let tap = MyTapGesture(target: self, action: #selector(self.tapTextView))
            tap.indexPath = indexPath
        cell.postContent.addGestureRecognizer(tap)
    }

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

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("cell tap")
        movePostDetail(indexPath)
    }
    @objc func tapTextView(sender:MyTapGesture){
        print("cell tap")
        movePostDetail(sender.indexPath)

    }
}
我的手势:

内容为NormalText+TagText

如果点击NormalText运行movePostDetail,如果点击TagText运行printURL,但在添加GestureRecognitor时始终移动PostDetail

如何一起使用

当我使用TTTAttributedLabel时,它工作得很好,但由于崩溃,所以我没有使用TTTAttributedLabel。

我建议您使用自定义属性名称并自行处理点击

Swift 4中的解决方案
我不知道AddGestureRecognitor现在在TableViewCell中。非常感谢。
class PostCell: TableViewCell {
    @IBOutlet weak var postContent: UITextView!
}
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.isUserInteractionEnabled = true
        cell.postContent.dataDetectorTypes = UIDataDetectorTypes.link
        cell.postContent.attributedText = (post["Content"] as! String).accentTagAndLink(tags: tags)
        let tap = MyTapGesture(target: self, action: #selector(self.tapTextView))
            tap.indexPath = indexPath
        cell.postContent.addGestureRecognizer(tap)
    }

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

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("cell tap")
        movePostDetail(indexPath)
    }
    @objc func tapTextView(sender:MyTapGesture){
        print("cell tap")
        movePostDetail(sender.indexPath)

    }
}
class MyTapGesture: UITapGestureRecognizer {
    var indexPath:IndexPath!
}
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    let tapGes = UITapGestureRecognizer(target: self, action: #selector(TableViewCell.handleTap(sender:)))
    contentTf.addGestureRecognizer(tapGes)

    let attributeName = "CustomAttributeName"
    let attStr = NSAttributedString(string: "https", attributes: [NSAttributedStringKey(rawValue: attributeName):"https"])

    contentTf.attributedText = attStr
}
@objc func handleTap(sender: UITapGestureRecognizer) -> Void {
    let myTextView = sender.view as! UITextView
    let layoutManager = myTextView.layoutManager

    // location of tap in myTextView coordinates and taking the inset into account
    var location = sender.location(in: myTextView)
    location.x -= myTextView.textContainerInset.left;
    location.y -= myTextView.textContainerInset.top;

    // character index at tap location
    let characterIndex = layoutManager.characterIndex(for: location, in: myTextView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    // if index is valid then do something.
    if characterIndex < myTextView.textStorage.length {

        // print the character index
        print("character index: \(characterIndex)")

        // print the character at the index
        let myRange = NSRange(location: characterIndex, length: 1)
        let substring = (myTextView.attributedText.string as NSString).substring(with: myRange)
        print("character at index: \(substring)")

        // check if the tap location has a certain attribute
        let attributeName = "CustomAttributeName"
        let attributeValue = myTextView.attributedText.attribute(NSAttributedStringKey(rawValue: attributeName), at: characterIndex, effectiveRange: nil) as? String
        if let value = attributeValue {
            print("You tapped on \(attributeName) and the value is: \(value)")
        }

    }
}
character index: 3
character at index: p
You tapped on CustomAttributeName and the value is: https