将UIButton添加到UICollectionViewCell时的奇怪行为

时间:2015-05-19 03:45:23

标签: ios objective-c uiimageview uibutton uicollectionviewcell

我正在尝试向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 - 切换仅在一个周期内起作用。完成第一轮选择和取消选择后,进一步点击后不再有反应。

有人能帮助我理解这个的原因,并且可能会给我一些如何解决它的提示吗?

谢谢!

此致 保罗

3 个答案:

答案 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]; 
}

希望你能做到这一点。