Swift:为TableViewCell设置变量

时间:2017-07-29 10:57:41

标签: ios swift uitableview

我有一个tableView,我的tableViewCell有一个isLiked变量和一个likeButton。我想将likeButton's tintColor相应地设置为isLiked的状态。我这样做的方法是从Firebase中检索用户喜欢的帖子列表,然后将其传递给tableView。如果postID与列表一致,我想将isLiked变量设置为true。

但是,尽管在cellForRow中设置了此逻辑,但tableViewCell中的isLiked变量并未相应设置。我怎样才能相应地设置它?我的代码如下:

// in TableViewController
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell

        let post: FIRDataSnapshot = self.posts[indexPath.row]
        let postValues = post.value as! [String: AnyObject]
        let postID = postValues["postID"] as! String

        for likedPosts in usersLikedPostsList {
            if likedPosts == postID {
                DispatchQueue.main.async {
                    cell.isLiked = true
                }
            } else {
                cell.isLiked = false
            }
        }

        return cell
    }
// in TableViewCell
class TableViewCell: UITableViewCell {

    var isLiked: Bool?

    @IBOutlet weak var likeButton: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()

        print(isLiked)
        if let _ = isLiked {
            likeButton.tintColor = .red
        } else {
            likeButton.tintColor = .darkGray
        }

    }
}

从print语句中,isLiked变量在加载表时为nil。我尝试使用self.tableView.reloadData(),但它也没有相应地设置它。

请注意,我想在TableViewCell中操作isLiked状态,因为我想添加代码以在TableViewCell中切换其状态,以便用户可以喜欢和不同于帖子,并相应地执行对Firebase的更新。

2 个答案:

答案 0 :(得分:3)

单元格awakeFromNib()方法只执行一次,当第一次从storyboard或Nib文件实例化单元格时,每次此值isLiked发生更改时,您需要更新单元格,尝试使用他的代码

    // in TableViewCell
    class TableViewCell: UITableViewCell {

    var isLiked: Bool = false{
        didSet{
            likeButton.tintColor = .darkGray
            if(isLiked)
            {
                likeButton.tintColor = .red
            }
        }
    }

    @IBOutlet weak var likeButton: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
    }
}

希望这有助于你

答案 1 :(得分:0)

let post: FIRDataSnapshot = self.posts[indexPath.row] let postValues = post.value as! [String: AnyObject] let postID = postValues["postID"] as! String 在视图中尝试上面的代码,加载并将postID作为全局变量。 并打印以查看它是否返回任何内容或使用.count进行检查。

如果计数超过1.然后尝试在方法中使用postID:cellForRowAt

其次,只有当numberOfRowsInSection与上次具有不同的值时,tableview重新加载才会起作用。

重新加载表时,检查是否调用此方法。