UICollectionView滚动到特定单元格

时间:2016-01-13 11:45:10

标签: ios uicollectionview swift2 uicollectionviewcell

我尝试创建一个应该在特定单元格中打开的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 }

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

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

编辑:删除了误导性信息

5 个答案:

答案 0 :(得分:3)

不要自己使用手机。

您的手机正在显示数据,对吧?他们一定。该数据(可以是数字,文本,图像,任何东西)应该是自定义对象。

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

所以你拥有Animal类,具有不同的属性(Sizeweightage)。再一次,所有的例子。也许您正在显示具有FirstName,Lastname等的学生列表。假设我们正在使用Animal

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

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

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

好的,现在对细胞,你知道你有多少,因此cellForRow将创建X细胞,X是你的数组的计数。

你可能有一个简单的单元格进行测试,比如

cell.title = animal.name

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

现在回答您的实际问题

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

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

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

你很好;)

ViewDidLayoutSubviewsviewDidAppear中执行此操作。 (第一个更好)。但是你必须在加载动物数组之后这样做,否则你将无法过滤任何数据。

一旦你在上面的链接中调用了这个方法,你的集合视图就会滚动,如果你很快就完成了它,它将加载到那个索引而不是索引零。

答案 1 :(得分:1)

我已通过此代码解决了这个问题,希望它对您有所帮助:

[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的上述参数。

你必须调整参数。

答案 2 :(得分:0)

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

使用以下方法基于indexpath创建NSIndexPath(forItem: filteredIndex, inSection: yourSectionIndex)

{{1}}

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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