swift - 如何从 viewcontroller 访问 tableview 单元格的属性?

标签 swift uitableview

请看截图。 ViewController 中有一个repliesTableView、replyTextField 和replyButtonrepliesTableView 单元格 称为ReplyCell。在 ReplyCell 中,有一个 commentTableView 用于列出该回复的所有评论,还有一个 textfField,一个 commentButton 用于添加新评论。

我在添加新回复和新评论时遇到问题。我想我需要在单击 Reply 按钮 时将 ReplyCell 中的 comments 数组 设为空。我怎样才能做到这一点?我不知道如何从根 ViewController 访问 comments 数组

确切问题:点击 commentButton 后,每个单元格中的所有评论都翻了一番。单击 replyButton 后,评论转到了错误的单元格。

enter image description here enter image description here

Code: 



import UIKit
import Firebase

class TopicForumVC: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {

@IBOutlet weak var topicNameLabel: UILabel!
@IBOutlet weak var replyNumberLabel: UILabel!

@IBOutlet weak var repliesTableView: UITableView!

@IBOutlet weak var replyTextField: UITextField!


var topicName:String?

var firstKey:String?

var secondKey:String?

var replies = [String]()

var replyButtonTapped = false

override func viewDidLoad() {
    super.viewDidLoad()

    repliesTableView.delegate = self
    repliesTableView.dataSource = self

    replyTextField.delegate = self

}

override func viewDidAppear(_ animated: Bool) {

    topicNameLabel.text = self.topicName

    loadReplies()
}

func loadReplies() {

    self.replies = []

    DataService.ds.Categories_Base.child(self.firstKey!).child("Topics").observe(.value, with:{(snapshot) in

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {

                if let topicDict = snap.value as? Dictionary<String,AnyObject> {

                    if let topic = topicDict["text"] as? String {

                        if topic == self.topicName {

                            self.secondKey = snap.key

                            UserDefaults.standard.setValue(snap.key, forKey: Key_SecondKey)

                            if let replyDict = topicDict["replies"] as? Dictionary<String,AnyObject> {

                                for eachDict in replyDict {

                                    if let textDict = eachDict.value as? Dictionary<String,AnyObject> {

                                        if let reply = textDict["text"] as? String {

                                            self.replies.append(reply)
                                            self.replyNumberLabel.text = String(self.replies.count)
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            self.repliesTableView.reloadData()
        }

    })

}



func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return replies.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if let cell = tableView.dequeueReusableCell(withIdentifier: "ReplyCell") as? ReplyCell  {

         let reply = replies[indexPath.row]

           cell.configureReplyCell(reply: reply)

            return cell

    } else {

        return UITableViewCell()
    }

}


@IBAction func replyButtonTapped(_ sender: Any) {

    replyButtonTapped = true

    if let reply = replyTextField.text, reply != "" {

        self.replies = []

        DataService.ds.Categories_Base.child(self.firstKey!).child("Topics").child(self.secondKey!).child("replies").childByAutoId().child("text").setValue(reply)

        self.repliesTableView.reloadData()

        let i = replies.count

        for n in 0..<i {

            let indexPath = IndexPath(row: n, section: 1)

            let cell = repliesTableView.cellForRow(at: indexPath) as! ReplyCell

            cell.comments = []

            cell.repliesToReplyTableView.reloadData()


        }

        self.replyTextField.text = ""

        self.replyButtonTapped = false
    }

  }

 import UIKit
 import Firebase


class ReplyCell:    UITableViewCell,UITableViewDataSource,UITableViewDelegate, UITextFieldDelegate {


@IBOutlet weak var replyTextView: UITextView!

@IBOutlet weak var repliesToReplyTableView: UITableView!

@IBOutlet weak var commentTextField: UITextField!

var reply:String?

var comments = [String]()

var replyKey:String?

override func awakeFromNib() {
    super.awakeFromNib()

    self.comments = []

    repliesToReplyTableView.delegate = self
    repliesToReplyTableView.dataSource = self

    commentTextField.delegate = self

        loadComments()

}

func configureReplyCell(reply:String) {

    self.reply = reply

    self.replyTextView.text = self.reply
}

func loadComments() {

    self.comments = []

    if let firstKey = UserDefaults.standard.value(forKey: Key_FirstKey) as? String, let secondKey = UserDefaults.standard.value(forKey: Key_SecondKey) as? String {

        DataService.ds.Categories_Base.child(firstKey).child("Topics").child(secondKey).child("replies").observe(.value, with:{(snapshot) in

            if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

                for snap in snapshots {

                    if let replyDict = snap.value as? Dictionary<String,AnyObject> {

                        if let reply = replyDict["text"] as? String {

                            if  reply == self.reply {

                                self.replyKey = snap.key

                                DataService.ds.Categories_Base.child(firstKey).child("Topics").child(secondKey).child("replies").child(snap.key).child("comments").observe(.value, with: { (commentSnapshot) in

                                    if let commentSnapshots = commentSnapshot.children.allObjects as? [FIRDataSnapshot] {

                                        for commentSnap in commentSnapshots {

                                            if let commentDict = commentSnap.value as? Dictionary<String,AnyObject> {

                                                if let comment = commentDict["text"] as? String {

                                                    self.comments.append(comment)

                                                }
                                            }
                                        }
                                    }

                                      self.repliesToReplyTableView.reloadData()

                                })
                            }
                        }
                    }
                }

            }

        })

    }

}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return comments.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let commentCell = tableView.dequeueReusableCell(withIdentifier:"CommentCell")

    commentCell?.textLabel?.text = comments[indexPath.row]

     return commentCell!
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)


}


@IBAction func commentBtnPressed(_ sender: Any) {

    if let comment = commentTextField.text, comment != "" {

        self.comments = []

        if let firstKey = UserDefaults.standard.value(forKey: Key_FirstKey) as? String, let secondKey = UserDefaults.standard.value(forKey: Key_SecondKey) as? String {

         DataService.ds.Categories_Base.child(firstKey).child("Topics").child(secondKey).child("replies").child(self.replyKey!).child("comments").childByAutoId().child("text").setValue(comment)

            if let myViewController = parentViewController as? TopicForumVC {

             //   myViewController.repliesTableView.reloadData()

                myViewController.replies = []
            }


            self.repliesToReplyTableView.reloadData()

            self.commentTextField.text = ""
            self.replyKey = ""
    }


  }

}

最佳答案

我真的不知道你正在构建什么的确切情况,但有两个想法可能会提供一些指导。

1) 如果您的表格显示的是来自数据源的内容,那么您可能会有某种引用。例如。加载单元格时(在本例中为 CustomCell),您将执行类似获取单元格索引从数据中获取相同索引将该数据放入单元格内容。如果是这种情况,您在单击按钮时所要做的就是将 tableview.cellForRowAtIndexPath 与您的 sender 对象一起使用,然后从数据源中删除数组,例如tableDataSource[index] = nil 并重新加载 tableView。

2) 如果您在 CustomCell 上有一个存储属性,您专门为存储此数组添加了该属性,那么您可以将发送者对象转换为 CustomCell 并删除该属性,如 Kim 的回答。

希望这会有所帮助,但如果没有更多信息,则很难判断。

关于swift - 如何从 viewcontroller 访问 tableview 单元格的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665924/

相关文章:

ios - 如何在单元格中保存复选标记附件

iphone - 目标 - C : Loading image from URL?

ios - 如何解析具有多个值的 json?

ios - 如何使用带有可变键的 codable 解码 JSON?

swift - 自定义单元格中的标签和 MPMediaItems

ios - 如何从 Storyboard 中获取 UIViewControl 对象的 nib 名称

java - 如何在 Swift 中复制这个 java 接口(interface)?

iOS heightForRowAtIndexPath 正确计算方式

ios - Swift UITableViewCell 显示默认隐藏的数据

xcode - 如何切换表格 View 中显示的数据