【问题标题】:Wrong data representation of UISwitch in UICollectionViewUICollectionView 中 UISwitch 的错误数据表示
【发布时间】:2013-01-11 20:09:20
【问题描述】:

我有一个 UICollectionView,我在其中表示从 SQLite 数据库获取的数据。当我向上和向下滚动 CollectionView 时,我遇到了 UISwitch 问题:

-(UICollectionViewCell *)collectionView:(UICollectionView *)cv 
     cellForItemAtIndexPath:(NSIndexPath *)indexPath {

 city_setlist *cellValue = [self.arr objectAtIndex:indexPath.row];

 UISwitch *onoff=(UISwitch *) [cell viewWithTag:106];
 onoff.tag=[cellValue._id_setlist intValue];
    
 if([cellValue._was_there isEqualToString:@"1"])
     [onoff setOn:YES animated:YES];
 else
     [onoff setOn:NO animated:YES];
}

如果我不滚动,数据还可以,但如果我开始上下滚动 CollectionView,UISwitch 会随机打开它应该关闭的位置,反之亦然。我做错了什么?

【问题讨论】:

  • 看来我们在这里遗漏了一些关键代码。你的dequeueReusableCellWithIdentifier 在哪里,而你正在返回cell,对吧?

标签: ios uicollectionview uiswitch


【解决方案1】:

单元格可以在平铺视图中重复使用。这段代码看起来像是假设单元格没有被重用:

UISwitch *onoff=(UISwitch *) [cell viewWithTag:106];
onoff.tag=[cellValue._id_setlist intValue];

我认为这会将开关的标记更改为 106 以外的值。这意味着如果该单元格稍后被重用,它将不再是 106,并且顶行将返回 nil。尝试删除我引用的第二行。 (您也可以通过记录滚动时在第一行中获得的 onoff 值来确认这是问题所在。)

一般来说,使用标签有点麻烦;通过为您的单元定义一个子类并将 UISwitch 连接到一个属性(例如,通过一个插座),您可能会发现它更简洁。

【讨论】:

  • 另外,您可能不希望在 setOn:animated: 调用中使用动画:YES。
  • 非常感谢,问题确实出在标签属性上。我需要分配“id_setlist”值以在 [onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged] 事件上验证它。那么哪个属性用于为单个 UISwitch 分配不同的值? PS:StackOverflow 告诉我,我可以在 23 小时内将这个赏金奖励给你..
  • 有很多方法可以解决这个问题。例如,你可以创建一个 UISwitch 的子类,它有一个额外的属性,你可以在其中存储其他值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多