Ios 从表视图转到详细控制器

Ios 从表视图转到详细控制器,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个TableViewController,其中的单元格显示登录用户和应用程序中任何其他用户之间的姓名、图片和最后一条消息。因为附加了一个单元格,仅显示未登录用户的名称。该单元格既有已登录用户的名称,也有未登录用户的名称,因此为了显示未登录用户的名称,我使用了以下代码 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

我有一个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
}}

但当我单击任何单元格时,它总是显示我单击的第一个单元格的名称

您必须在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,则可以将其删除。