单击单元格时无效的UILabel内容

时间:2018-12-03 05:56:38

标签: swift uitableview

我有一个带有自定义单元格的UITableView

class customChatCell: UITableViewCell {

    @IBOutlet weak var userName: UILabel!
    @IBOutlet weak var userMessage: UILabel!

我在userMessage中有一个用于打开URL的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let identifier = "ClientCell"
    self.cell = self.tableView.dequeueReusableCell(withIdentifier: identifier) as? customChatCell
    self.cell.selectionStyle = UITableViewCell.SelectionStyle.none

    // Unpack message from Firebase DataSnapshot
    let messageSnapshot = self.messages[indexPath.row]
    guard let message = messageSnapshot.value as? [String: String] else { return cell }
    let name = message[Constants.MessageFields.name] ?? ""

    if let imageURL = message[Constants.MessageFields.imageURL] {
        self.cell.userName.text = name

        self.cell.hiddenLabel.isHidden = true
        self.cell.userMessage.text = imageURL

        let tap = UITapGestureRecognizer(target: self, action: #selector(FCViewController.tapFunction))

        self.cell.addGestureRecognizer(tap)

        if self.cell.userName.text == Auth.auth().currentUser?.displayName {
            self.cell.userName.textAlignment = .right
            self.cell.userMessage.textAlignment = .right
            self.cell.hiddenLabel.textAlignment = .right
        } else {
            self.cell.userName.textAlignment = .left
            self.cell.userMessage.textAlignment = .left
            self.cell.hiddenLabel.textAlignment = .left
        }
        self.cell.setNeedsLayout()

    } else {
        let text = message[Constants.MessageFields.text] ?? ""

        self.cell.userName.text = name
        self.cell.userMessage.text = text

        self.cell.hiddenLabel.isHidden = true
        self.cell.hiddenLabel.isUserInteractionEnabled = false

        if self.cell.userName.text == Auth.auth().currentUser?.displayName {
            self.cell.userName.textAlignment = .right
            self.cell.userMessage.textAlignment = .right
        } else {
            self.cell.userName.textAlignment = .left
            self.cell.userMessage.textAlignment = .left
        }
    }
    return cell
}

@objc func tapFunction(sender:UITapGestureRecognizer) {
    var url = URL(string: self.cell.userMessage.text!)!
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

但是,当单击任何单元格时,始终仅打开最后一个单元格中包含的链接。无论我单击哪个单元格。

如何做到这一点,以便当您单击单元格时,将打开特定userMessage中包含的特定链接?

2 个答案:

答案 0 :(得分:1)

您必须为每个单元格设置标签。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let identifier = "ClientCell"
self.cell = self.tableView.dequeueReusableCell(withIdentifier: identifier) as? customChatCell

...

    self.cell.tag = indexPath.row // SETTING TAG TO EACH CELL. 0,1,2...

...
    let tap = UITapGestureRecognizer(target: self, action: #selector(FCViewController.tapFunction))
    self.cell.addGestureRecognizer(tap)

...
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("CELL_TAG_NUMBER.  ", sender.view.tag)
    let messageSnapshot = self.messages[sender.view.tag] THIS WILL GIVE, 0,1,2...

    print("Exact_URL.  ", messageSnapshot)

    //var url = URL(string: self.cell.userMessage.text!)!
    //UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

答案 1 :(得分:0)

无需向单元格添加轻击手势,UITableView具有用于选择单元格时的委托方法。如果使用它,那么您也不需要使用标记(不是很好!)来跟踪单元格,而是将使用该特定单元格的直接indexPath。

实施此方法

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    //Now you have your selected cell
    let messageSnapshot = self.messages[indexPath.row]
    print(messageSnapshot)

}