【问题标题】:UICollectionView and Scrolling Program BugUICollectionView 和滚动程序错误
【发布时间】:2013-09-26 23:40:44
【问题描述】:

我在普通的 UIViewController 中有一个 UICollectionView。

在集合视图中,我为情节提要中的集合视图单元设计了可重用的 UI。

collectionviewcell 内部有一个标签,显示单元格 indexpath.row 和 5 个 UIButtons,如果选中,它们会改变颜色并保持选中状态。

我已经设置了collectionview,因此如果请求超过30 个单元格,collectionview 将水平分页,collectionview 布局也是水平的。

应用程序运行良好,滚动正常,单元格布局正确。

问题我遇到的问题是当您在 collectionviewcell(假设布局 100 个单元格)中选择例如 单元格 1 中的按钮 A 并在两页上翻页(60+ 单元格)到第 3 页,单元格编号 75 中的按钮 A 被选中。此外,如果您滚动到末尾(100 个单元格)并回滚到第 3 页,则第 75 号单元格中的按钮 A 会被选中,但会选择第 64 号单元格中的 按钮 A

这里是一些sn-ps的代码: cell.m - 控制用户的操作。

- (IBAction)bubbleButtons:(id)sender {
    for(UIButton *bubbleCell in self.bubbleButtons) {
            if (bubbleCell.touchInside && !bubbleCell.selected) {
                bubbleCell.selected = YES;
            } else if (bubbleCell.touchInside && bubbleCell.selected) {
                bubbleCell.selected = NO;
            }
      }

 }

MainViewContoller.m - 从情节提要中制作的 UICollectionViewCell 设置单元格

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
                 cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        Cell *cell1;
        cell1 =[collectionView dequeueReusableCellWithReuseIdentifier:zCellID
                                                         forIndexPath:indexPath];
        cell1.numMainLabel.text = [NSString stringWithFormat:@"%d |",indexPath.row+1];
        return cell1;

我真的不明白什么是错误的或导致此错误的原因,我假设它与视图的新部分变得可见时重新加载的视图有关,但这只是一个猜测。非常感谢您的帮助。

  • 扎克

【问题讨论】:

    标签: ios objective-c uiscrollview uicollectionview uicollectionviewcell


    【解决方案1】:

    可能是因为可复用视图被复用了。

    这样做的正确方法是创建自定义可重用视图子类。 并保存对这 5 个按钮的选择。

            cell1 =[collectionView dequeueReusableCellWithReuseIdentifier:zCellID
    

    这里的这一行可能会或可能不会给你一个新的单元格,它可能会给你一个以前使用过的单元格。因此,您需要更新其中的选择。或者它与它正在重复使用的单元格保持相同。

    【讨论】:

    • 那么我应该在 resablecell 中创建一个自定义的可重用视图吗?最终我需要能够保存选定的按钮并知道用户在 UIButtons bubbleButtons 的 OutletConnection 中选择了哪个按钮。
    • 通过可重复使用的视图,我的意思是可重复使用的单元格。您需要保存选择,否则它不会被承诺在那里。您可以将选择保存在可重用的 ell 子类中,或者更好地将其保存在其他地方的模式中。请记住,视图永远不会用于存储信息。
    • 但是你如何检测出口连接中的哪个按钮被选中,然后为特定单元格保存选择并将选择存储在字典中?因为单元格索引路径来自 MainViewController,所以单元格子类如何知道按钮是在哪个单元格中选择的?
    【解决方案2】:

    Uicollection 只生成当时显示的单元格,因此当单元格从可见视图中消失时,它会被新的单元格替换。

    因此,当您选择单元格 75 并向下滚动时,直到单元格 75 不可见,然后您滚动回单元格 75,您正在生成一个新单元格,其中包含一个未选择的新按钮,因为它是新的.

    所以你可以做的是保存哪些按钮被选中,然后在

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

    询问是否需要选择此时显示的按钮..

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多