从表格视图中查看详细的控制器

时间:2017-07-11 14:25:48

标签: ios swift firebase firebase-realtime-database

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

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

3 个答案:

答案 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
}