将 UIButton 添加到 UICollectionViewCell 时的奇怪行为
Strange behavior when adding UIButton to UICollectionViewCell
我正在尝试将 UIButton
添加到 UICollectionViewCell
。该按钮的主要目的是让用户 select 他们的最爱。
当他们点击 UIButton
时,UIButton
将显示一个发光的星形图像,表明该项目已被选为收藏。
再次点击UIButton
,按钮return显示原图带空星,意思是deselection。
我的实现方式如下:
1 - 在故事板中,将 UIButton 放入 UICollectionViewCell
,ctrl-drag 按钮到单元格的 .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
时,当我单击一个单元格上的按钮时,出现 "strange" 行为:
1 - 单击一个单元格将一个按钮变成最喜欢的发光星星,向下滚动列表后,下方其他一些单元格上的按钮也会变成 selected。
2 - 开关只作用一个周期。完成第一轮select和deselect后,再点击不再有反应。
谁能帮我理解这个问题的原因,并可能给我一些解决方法的提示?
谢谢!
此致,
保罗
发生这种情况是因为小区重复使用。因为 self.favoriteChecked
是自定义 collection 单元格 class 中的 属性,并且它的值仅在 class 导致此问题的内部更新。
此问题的解决方案是,如果您使用自定义 object 模型从 viewcontroller 填充 collection 个单元格,然后在收藏按钮上单击更新该自定义 [= =27=] 并在 cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义 collectionviewcell class.
的 favoriteChecked
状态
如果您不使用自定义 object,则需要单独保存收藏夹列表,可以是收藏夹的索引路径,也可以是收藏夹的唯一标识符。然后在 cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义 collectionviewcell class.
的 favoriteChecked
状态
这不是什么奇怪的行为。您已从模型数据对象加载单元格。您必须跟踪并保持数组中按钮单击数据的状态变化,然后加载单元格数据值。
这是一个示例代码:它与您的问题的解决方案一致。
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];
}
希望你有这样做的想法。
在您的按钮操作中添加此代码
CGPoint ButtonPoint = [sender convertPoint:CGPointZero toView:self.collectionView];
NSIndexPath *ButtonIndex = [self.collectionView indexPathForItemAtPoint:ButtonPoint];
buttonindexpath = ButtonIndex.row
[collectionView reloadData];
现在在您的 cellForItemAtIndexPath 中,检查是否 indexPath.row == buttonindexpath,如果是,请提供您在按钮操作中提供的代码....
即....
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];
}
}
希望一切顺利
我正在尝试将 UIButton
添加到 UICollectionViewCell
。该按钮的主要目的是让用户 select 他们的最爱。
当他们点击 UIButton
时,UIButton
将显示一个发光的星形图像,表明该项目已被选为收藏。
再次点击UIButton
,按钮return显示原图带空星,意思是deselection。
我的实现方式如下:
1 - 在故事板中,将 UIButton 放入 UICollectionViewCell
,ctrl-drag 按钮到单元格的 .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
时,当我单击一个单元格上的按钮时,出现 "strange" 行为:
1 - 单击一个单元格将一个按钮变成最喜欢的发光星星,向下滚动列表后,下方其他一些单元格上的按钮也会变成 selected。
2 - 开关只作用一个周期。完成第一轮select和deselect后,再点击不再有反应。
谁能帮我理解这个问题的原因,并可能给我一些解决方法的提示?
谢谢!
此致, 保罗
发生这种情况是因为小区重复使用。因为 self.favoriteChecked
是自定义 collection 单元格 class 中的 属性,并且它的值仅在 class 导致此问题的内部更新。
此问题的解决方案是,如果您使用自定义 object 模型从 viewcontroller 填充 collection 个单元格,然后在收藏按钮上单击更新该自定义 [= =27=] 并在 cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义 collectionviewcell class.
favoriteChecked
状态
如果您不使用自定义 object,则需要单独保存收藏夹列表,可以是收藏夹的索引路径,也可以是收藏夹的唯一标识符。然后在 cellForItemAtIndexPath
方法中检查收藏状态的值并更新自定义 collectionviewcell class.
favoriteChecked
状态
这不是什么奇怪的行为。您已从模型数据对象加载单元格。您必须跟踪并保持数组中按钮单击数据的状态变化,然后加载单元格数据值。
这是一个示例代码:它与您的问题的解决方案一致。
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];
}
希望你有这样做的想法。
在您的按钮操作中添加此代码
CGPoint ButtonPoint = [sender convertPoint:CGPointZero toView:self.collectionView];
NSIndexPath *ButtonIndex = [self.collectionView indexPathForItemAtPoint:ButtonPoint];
buttonindexpath = ButtonIndex.row
[collectionView reloadData];
现在在您的 cellForItemAtIndexPath 中,检查是否 indexPath.row == buttonindexpath,如果是,请提供您在按钮操作中提供的代码.... 即....
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];
}
}
希望一切顺利