【问题标题】:UICollectionView scroll to specific cellUICollectionView 滚动到特定单元格
【发布时间】:2016-01-13 11:45:10
【问题描述】:

我尝试创建一个UICollectionView,该UICollectionView 应该在特定单元格中打开。

我的方法是存储所有单元格:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) ->
        UICollectionViewCell {
  // my code
  cells.append(cell)
  return cell
}

然后在viewDidAppear中找到想要的单元格:

let result:[MyCell] = cells.filter{ $0.myProperty!.uuid == selectedUUID }

很遗憾,在单元格数组中找不到所需的单元格,因为尚未存储所有单元格。

我是朝着正确的方向前进还是需要不同的解决方案?

编辑:删除误导性信息

【问题讨论】:

    标签: ios uicollectionview swift2 uicollectionviewcell


    【解决方案1】:

    不要使用单元本身。

    您的单元格正在显示数据,对吗?他们一定。该数据(可以是数字、文本、图像或任何东西)应该是自定义对象。

    例如,您正在显示动物列表。

    所以你有 Animal 类,具有不同的属性(Sizeweightage)。再一次,都是一个例子。也许您正在显示具有名字、姓氏等的学生列表。假设我们使用的是Animal

    你有一个 Animal 对象数组,你可以有 1、4 或 234234,没关系。该阵列可以容纳任意数量的动物。但是你只有一个数组。

    您的集合视图(或表格视图)需要为每一行创建一个单元格。几排?!很简单,其他方法告诉我们每个部分有特定的行数。假设我们只有一个部分。

    如何定义行?你给他一个号码。什么号码?数组中的动物数量。例如,5。或者,更好的是myAnimalsArray.Count。现在如果你有 20 只动物,你就会有 20 个细胞。如果你有 3 只动物,你就会有 3 个细胞。

    好的,现在到单元格,你知道你有多少,因此 cellForRow 将创建 X 个单元格,X 是你的数组的计数。

    你可能会有一个简单的单元用于测试,比如

    cell.title = animal.name
    

    然后返回单元格。这里全是伪代码,但你明白了。

    现在回答您的实际问题

    我写了所有这些,因为根据您在其他答案中的其他 cmets,您似乎很困惑。

    你有你的动物数组(数据),但还没有细胞。例如,您想从名字以 E 开头的动物开始。好吧,在阵列上所有动物之后,您需要找到以 E 开头的动物(或您可能喜欢的任何其他过滤器)。您可以通过搜索方法找到它。完成后,您将知道数组中动物的索引。是数组的第 23 项,是大象。

    使用第 0 节和索引 23 创建一个 NSIndexPath 对象(因为您的过滤器再次发现它是第 23 项,我只是在使用示例),并将该 indexPath 对象传递给 scroll method of the collectionview

    你很好;)

    ViewDidLayoutSubviewsviewDidAppear 中执行此操作。 (第一个更好)。但是您必须在加载动物数组之后执行此操作,否则您将没有任何数据要过滤。

    一旦你调用了上面链接中的方法,你的collectionview就会滚动,如果你做得够快,它将在那个索引处加载,而不是在索引0处。

    【讨论】:

    • 感谢您的深入解释。还有一些其他问题,但我自己创建了一个自定义索引以在scrollToItemAtIndexPath 中使用。
    • 赞成这部分。创建一个 NSIndexPath 对象,其中第 0 部分和索引 23(因为您的过滤器发现它是第 23 项,我只是在使用示例),并将该 indexPath 对象传递给 collectionview 的滚动方法。
    【解决方案2】:

    我已经通过这段代码解决了这个问题,希望对你有所帮助:

    [self.collectionview setContentOffset:CGPointMake(0,self.collectionview.contentSize.height-self.collectionview.frame.size.height/2) animated:YES];
    

    仅将上面的参数设置为contentsize:CGSizemake(x,y);

    通过调整所需参数,您可以滚动到特定单元格。 只需将上述参数替换为contentsize:CGSizemake(x,y); 方法中的 c 和 y 即可。

    你必须调整参数。

    【讨论】:

    • 对不起,我的描述不清楚。要找到索引,我需要先找到单元格,但我找不到。
    【解决方案3】:

    UICollectionView 的单元格被重用
    例如,如果视图一次只能显示 3 个单元格:A、B、C;那么你的细胞可能像 [A, B, C, A, B, C, A, B, ...];

    每次你设置cell的属性,uuid都会被重置为一个新的值。 所以你不能过滤掉你想要的东西。 Hitendra Hckr 是对的,你应该“过滤数据数组而不是过滤单元格数组”。

    或者您可以“alloc”新单元格而不是“dequeueReusableCellWithReuseIdentifier:forIndexPath:”。(不推荐)

    【讨论】:

    • 你可以用index -> uuid这样的字典保存,然后循环字典的键(可以排序),比较值并保存到数组中。
    【解决方案4】:

    对于您的情况,您需要过滤数据数组而不是过滤单元格数组,这样您可以获得准确的索引。

    基于filteredIndex 使用下面的方法创建indexpath

    NSIndexPath(forItem: filteredIndex, inSection: yourSectionIndex)
    

    这样你可以滚动到特定的单元格。

    【讨论】:

    • 对不起,我的描述不清楚。要找到索引,我需要先找到单元格,但我做不到。但是,我如何访问data
    【解决方案5】:

    尝试在 scrollToItemAtIndexPath 之前添加对 collectionView.reloadData() 的调用。这将确保创建所有必需的单元格。

    【讨论】:

    • 对不起,我的描述不清楚。要找到索引,我需要先找到单元格,但我做不到。 collectionView.reloadData()在搜索单元格之前并没有创建所有单元格,只有一个。
    猜你喜欢
    • 2017-02-07
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多