我有一个collectionViewCell
我想要添加一个功能的按钮(喜欢/不像功能)如果用户喜欢这个帖子,那么post标签应该设置为1,(颜色变为蓝色)如果用户与按钮标签不同,它重置为0.(颜色变为白色)我当前遇到的问题是在我的collectionView中按下随机按钮时按钮颜色正在改变,即使没有选中。
class customCollectionViewCell: UICollectionViewCell {
@IBAction func followBtn(sender: UIButton) {
if (sender.tag == 0){
likePost{(msg)
in
if (msg == 0){
self.likeBtn.tintColor = UIColor.blueColor()
self.likeBtn.tag = 1
}
}
}
else{
//Unfollow function
self.likeBtn.tintColor = UIColor.whiteColor()
self.likeBtn.tag = 0
}
}
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("posterCell", forIndexPath: indexPath)
as! customCollectionViewCell
cell.likeBtn.tag = 0
if (cell.liketBtn.tag == 0){
cell.followArtistBtn.tintColor = UIColor.whiteColor()
}
if (cell.likeBtn.tag == 1){
cell.followArtistBtn.tintColor = UIColor.blueColor()
}
}
答案 0 :(得分:1)
这是由于细胞重用。您必须在cellForItemAtIndexPath
中设置默认值,然后根据您的数据相应地更改按钮的颜色。
答案 1 :(得分:1)
由于您没有根据按钮的选择更改数据源,因此发生此问题。这是一些基本步骤
var users = NSMutableArray()
let user1 = ["name" : "Sample User 1", "age": 21, "isFav": 0];
let user2 = ["name" : "Sample User 2", "age": 21, "isFav": 0];
users = [user1, user2]
@IBAction func followBtn(sender: UIButton) {
var dicUser = NSMutableDictionary(dictionary: users [sender.tag])
dicUser["isFav"] = (dicUser.valueForKey("isFav") as! Bool) ? 0 : 1;
users.replaceObjectAtIndex(sender.tag, withObject: dicUser)
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("posterCell", forIndexPath: indexPath)
as! customCollectionViewCell
cell.likeBtn.tag = indexPath.row
cell.followArtistBtn.tintColor =(users[sender.tag]].valueForKey("isFav") as! Bool) ? UIColor.whiteColor() : UIColor.blueColor();
}
答案 2 :(得分:0)
这种情况正在发生,因为集合视图每次都重用相同的单元格。 为此你根据每个单元格位置将你的标签存储在一个数组中...当用户滚动和单元格加载时......检查该标签的标签是1还是0 ...并根据该标签更改按钮颜色
答案 3 :(得分:0)
这是因为细胞重复使用。您必须在cellforrowatindexpath
中将默认值设置为单元格,然后将值分配给控件。
如果您习惯于创建少量行,则可以在不重用单元格的情况下为每一行出列单元格。但它不是大量行的最佳实践。