我有一个带有自定义单元格的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
中包含的特定链接?
答案 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)
}