2017-07-29 46 views
0

我有一个tableView和我的tableViewCell有一个isLiked变量和一个likeButton。我想将我的likeButton's tintColor设置为isLiked的状态。我这样做的方式是从Firebase中检索用户喜欢的帖子列表,然后将其传递到tableView中。如果postID符合列表,我想将isLiked变量设置为true。Swift:设置TableViewCell的变量

但是,尽管在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 
     } 

    } 
} 

从打印语句,isLiked变量是零加载表时。我试图用self.tableView.reloadData(),但它也没有相应地设置它。

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

回答

2

只有一次,执行awakeFromNib()方法将细胞在第一时间将小区从情节串连图板或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() 
    } 
} 

希望这可以帮助你

+0

简单而优雅,谢谢! – Koh

0

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

如果有比计算更1.Then尝试的方法来使用帖子ID:cellForRowAt

其次,实现代码如下重装将工作只有numberOfRowsInSection有从上次不同的值。

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