我正在尝试向UIButton
添加UICollectionViewCell
。该按钮的主要目的是让用户选择他们的收藏夹。
当他们点击UIButton
时,UIButton
会显示一个发光的星形图像,表明该项目已被选为收藏。
再次单击UIButton
,按钮返回显示空星的原始图像,意味着取消选择。
我意识到这一点的方式如下:
1 - 在故事板中,将UIButton放入UICollectionViewCell
,按住Ctrl键将按钮拖动到单元格的.h文件,以设置一个名为
-(IBAction)favoriteBtnClick:(id)sender;
2 - 在单元格的.m文件中,按如下方式编辑操作:
-(IBAction)favoriteBtnClick:(id)sender {
if ([self.favoriteChecked isEqualToString:@"NO"]) {
UIImage *image = [UIImage imageNamed:@"FavoriteSelected.PNG"];
[sender setBackgroundImage:image forState:UIControlStateNormal];
self.favoriteChecked = @"YES";
} else if ([self.favoriteChecked isEqualToString:@"YES"]) {
UIImage *image = [UIImage imageNamed:@"FavoriteBlank.PNG"];
[sender setBackgroundImage:image forState:UIControlStateNormal];
}
}
然而,当我尝试运行UICollectionView
时,当我点击一个单元格上的按钮时,发生了“奇怪”行为:
1 - 在向下滚动列表后,单击一个单元格将一个按钮转到最喜欢的发光星形,下面其他一些单元格上的按钮也会被选中。
2 - 切换仅在一个周期内起作用。完成第一轮选择和取消选择后,进一步点击后不再有反应。
有人能帮助我理解这个的原因,并且可能会给我一些如何解决它的提示吗?
谢谢!
此致 保罗
答案 0 :(得分:6)
在按钮操作中添加此代码
if (indexPath.row == buttonindexpath)
{
if ([self.favoriteChecked isEqualToString:@"NO"])
{
UIImage *image = [UIImage imageNamed:@"FavoriteSelected.PNG"];
[sender setBackgroundImage:image forState:UIControlStateNormal];
self.favoriteChecked = @"YES";
}
else if ([self.favoriteChecked isEqualToString:@"YES"])
{
UIImage *image = [UIImage imageNamed:@"FavoriteBlank.PNG"];
[sender setBackgroundImage:image forState:UIControlStateNormal];
}
现在在你的cellForItemAtIndexPath中,检查indexPath.row == buttonindexpath,如果是,则给出你在按钮动作中给出的代码.... 即....
{{1}}
}
希望这很好用
答案 1 :(得分:0)
由于细胞重用,这种情况正在发生。因为self.favoriteChecked
是自定义集合单元类中的属性,并且其值仅在该类内更新导致此问题。
此问题的解决方案是,如果您使用自定义对象模型从viewcontroller填充集合单元格,则在收藏夹按钮上单击更新该自定义对象上的收藏状态,并在cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义collectionviewcell类的favoriteChecked
状态。
如果您不使用自定义对象,则需要将喜爱项目列表分别保留为收藏项目的索引路径或fav项目的唯一标识符。然后在cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义collectionviewcell类的favoriteChecked
状态。
答案 2 :(得分:0)
这不是一个奇怪的行为。您已从模型数据对象加载单元格。你必须跟踪&保持按钮点击数据的状态更改在数组和&然后加载单元格数据值。
以下是一个示例代码:它与您的问题的解决方案保持一致。
NSMutableArray *favoriteStatusArray = [[NSMutableArray alloc]init];
// assume favoriteStatusArray is initialized with all BOOL as NO.
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
SomeCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
cell.favoriteButton.tag = indexPath.row;
[cell.favoriteButton addTarget:self action:@selector(peformFavoriteChange:) forControlEvents:UIControlEventTouchUpInside];
if([[favoriteStatusArray objectAtIndex:indexPath.row] boolValue] == NO)
UIImage *image = [UIImage imageNamed:@"FavoriteSelected.PNG"];
[cell.favoriteButton setBackgroundImage:image forState:UIControlStateNormal];
}else {
UIImage *image = [UIImage imageNamed:@"FavoriteBlank.PNG"];
[cell.favoriteButton setBackgroundImage:image forState:UIControlStateNormal];
}
return cell;
}
-(void)peformFavoriteChange:(UIButton *)sender
{
BOOL oldValue = [[favoriteStatusArray objectAtIndex:sender.tag] boolValue];
[favoriteStatusArray replaceObjectAtIndex:sender.tag withObject:[NSNumber numberWithBool:!oldValue]];
[myCollectionView reloadData];
}
希望你能做到这一点。