我尝试创建一个应该在特定单元格中打开的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 }
不幸的是,在单元格数组中找不到所需的单元格,因为尚未存储所有单元格。
我是朝着正确的方向前进还是需要不同的解决方案?
编辑:删除了误导性信息
答案 0 :(得分:3)
不要自己使用手机。
您的手机正在显示数据,对吧?他们一定。该数据(可以是数字,文本,图像,任何东西)应该是自定义对象。
例如,您正在显示动物列表。
所以你拥有Animal
类,具有不同的属性(Size
,weight
,age
)。再一次,所有的例子。也许您正在显示具有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。
你很好;)
在ViewDidLayoutSubviews
或viewDidAppear
中执行此操作。 (第一个更好)。但是你必须在加载动物数组之后这样做,否则你将无法过滤任何数据。
一旦你在上面的链接中调用了这个方法,你的集合视图就会滚动,如果你很快就完成了它,它将加载到那个索引而不是索引零。
答案 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: ”。(不推荐)