Ios 从表视图转到详细控制器
我有一个TableViewController,其中的单元格显示登录用户和应用程序中任何其他用户之间的姓名、图片和最后一条消息。因为附加了一个单元格,仅显示未登录用户的名称。该单元格既有已登录用户的名称,也有未登录用户的名称,因此为了显示未登录用户的名称,我使用了以下代码Ios 从表视图转到详细控制器,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个TableViewController,其中的单元格显示登录用户和应用程序中任何其他用户之间的姓名、图片和最后一条消息。因为附加了一个单元格,仅显示未登录用户的名称。该单元格既有已登录用户的名称,也有未登录用户的名称,因此为了显示未登录用户的名称,我使用了以下代码 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
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
}}
但当我单击任何单元格时,它总是显示我单击的第一个单元格的名称 您必须在tableView\uuDidSelectRowat:method中将该值分配给self.username。这些变化应该反映在那时
我假设当用户选择tableView行时,您正在触发segue on,而当用户选择tableView行时,您没有将新值分配给self.username,因此它会一直显示旧值 您可以通过使用UITableViewDelegate的“didSelectRowAt”来归档此文件 试试这个:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) as? MessageTableViewCell else {
return
}
self.username = cell.username
}
下面是在PrepareforSegue方法中需要做的事情,您可以从选中的单元格中获取用户名,并将其设置为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
}
我在didSelectRowAt中做了完全相同的事情,但它仍然不工作Cell没有属性用户名我编辑了我的答案。您需要将其强制转换为您使用的UITableViewCell。MessageTableViewCell此单元格有一个显示用户名的属性。我的意思是在名为username的单元格中没有变量。我以为TableViewCell在单元格的某个位置分配了用户名。这就是您在问题中所描述的。不客气,如果您仅将viewcontroller用户名变量用于设置为chatVC,则可以将其删除。