Недопустимое содержимое UILabel при нажатии на ячейку - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть UITableView с пользовательскими ячейками:

class customChatCell: UITableViewCell {

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

И у меня есть код для открытого URL-адреса, содержащийся в userMessage:

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 голосов
/ 03 декабря 2018

Нет необходимости добавлять жест касания в ячейку, в UITableView есть метод делегата для выбора ячейки.если вы используете это, вам также не нужно отслеживать ваши ячейки, используя тег (Not GOOD!), вместо этого вы будете использовать прямой indexPath этой конкретной ячейки.

реализует этот метод

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

}
0 голосов
/ 03 декабря 2018

Вы должны установить тег для каждой ячейки.

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...