我有一个TableViewController,其中的单元格显示登录用户与应用程序中任何其他用户之间的姓名,图片和最后一条消息。因为附加单个单元格仅显示未登录用户的名称。单元格同时具有登录用户的名称而不是登录用户的名称,因此为了显示未登录用户的名称,我使用了此代码。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageTableViewCell
if message.ReceiverId != self.loggedInUserUid {
var newVariable = message.ReceiverId
if let imageName = newVariable {
let ref = FIRDatabase.database().reference().child("users").child(imageName)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = snapshot.value as! [String: AnyObject]
//let messages = post.value as! [String: AnyObject]
for (id, value) in messages {
self.username = messages["username"] as? String
}}}})}}else if message.senderId != self.loggedInUserUid {
et newVariable = message.senderId
if let imageName = newVariable {
let ref = FIRDatabase.database().reference().child("users").child(imageName)
ref.observeSingleEvent(of: .value, with: { (snapshot)
in
if let dictionary = snapshot.value as? [String: AnyObject]{
for post in dictionary {
let messages = snapshot.value as! [String: AnyObject]
// let messages = post.value as! [String: AnyObject] ---> very confused why it changed from post to snapshot, if I put post.value, it doesn't let me run
for (id, value) in messages {
self.username = messages["username"] as? String
它显示未登录的用户名,这就是我想要的,但是当我转到新页面时,我也希望传递该名称,具体取决于所选的单元格。
override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "MessageNow", let chatVc = segue.destination as? SendMessageViewController else {
return
}
chatVc.username = self.username
}}
但是当我点击任何单元格时,它总是显示我点击的第一个单元格的名称。
答案 0 :(得分:1)
以下是准备segue方法时需要做的事情,您可以从选中的单元格中获取userName并将其设置为chatVC
override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "MessageNow", let chatVc = segue.destination as? SendMessageViewController else {
return
}
let selectedIndexPath = tableView.indexPathForSelectedRow
let cell = tableView.cellForRow(at: selectedIndexPath) as! YourCustomCell
chatVc.username = cell.userNameLabelPropertyOfYourCell.text
}
答案 1 :(得分:0)
您必须在self.username
方法中将值分配给tableView(_:didSelectRowAt:)
。这些变化应该反映出来。
我假设您在用户选择tableView行时触发segue,并且当用户选择tableView行时您没有将新值分配给self.username
,因此它会一直显示旧值。
答案 2 :(得分:0)
你可以通过使用UITableViewDelegate的'didSelectRowAt'来实现这个目的
试试这个:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) as? MessageTableViewCell else {
return
}
self.username = cell.username
}