UICollectionView - 基于水平滚动更新数组 indexPath
Posted
技术标签:
【中文标题】UICollectionView - 基于水平滚动更新数组 indexPath【英文标题】:UICollectionView - Update Array indexPath based on Horizontal Scrolling 【发布时间】:2016-08-01 06:53:43 【问题描述】:您好,我使用两个集合单元格显示数据,子集合视图值基于主集合视图。
我有视频列表,当我选择表中的视频时,我会在索引路径处传递完整的数组,这样主集合视图将根据数组的选定索引路径显示。
它显示得很好,但是当我水平滚动它时,我会传递一个可见的单元格 indexPath 数据来获取子集合视图数据。
但是当我滚动 Main Collection View 时,indexPath 处的数组不会根据 Main Collection View 更新,它始终显示从视频列表(上一个视图控制器)传递的相同 IndexPath。
如何根据水平滚动更新主集合视图数组。
我想要这个场景-
例如VIdeo列表数组为1,2,3,4
我选择 3 索引并传递给 videolist 数组的集合视图,它显示选定的索引路径行值,当我向右滚动时,索引路径应该在右侧增加到 4,对于任何值,它应该减少到 2在视频列表阵列上选择。主集合视图应根据传递的索引路径工作并根据其索引路径进行操作
我的代码-
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
if(self.childCollectionView ==collectionView)
return [self.array_ChildElements count];
else
return [self.array_VideoList count];
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
if (collectionView ==self.collectionView)
VVCollectionCell *cell = (VVCollectionCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"VVCollectionCell" forIndexPath:indexPath];
VVSystems *obj;
if (self.iscalledFromVideoLIst)
obj =self.array_VideoList[self.selectedIndexPath.row];
else
obj =self.array_VideoList[indexPath.row];
[self.collectionView flashScrollIndicators];
NSLog(@"Current Index Path--->%ld",(long)self.selectedIndexPath.row);
NSLog(@"Current Title--->%@",obj.title);
[cell.labelVideoTitle setText:obj.title];
[cell.imgVideo sd_setImageWithURL:[NSURL URLWithString:obj.iconImage]
placeholderImage:nil];
return cell;
else
childCollectionCell *cell2 = (childCollectionCell *)[self.childCollectionView dequeueReusableCellWithReuseIdentifier:@"childCollectionCell" forIndexPath:indexPath];
ChildAnimations *obj = self.array_ChildElements[indexPath.row];
[self.childCollectionView flashScrollIndicators];
[cell2.labelTitel setText:obj.tagName];
[cell2.imgbackGround sd_setImageWithURL:[NSURL URLWithString:obj.image]
placeholderImage:nil];
return cell2;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
for (VVCollectionCell *cell in [self.collectionView visibleCells])
NSIndexPath *newIndexPath = [self.collectionView indexPathForCell:cell];
VVSystems *objCustVehiclesList =self.array_VideoList[newIndexPath.row];
NSLog(@"Current Index Path Row -->%ld",(long)newIndexPath.row);
NSLog(@"Current Title--->%@",objCustVehiclesList.title);
self.str_partID =objCustVehiclesList.partID;
[self ServiceCallForChildVideo:self.str_partID];
self.iscalledFromVideoLIst = NO;
【问题讨论】:
很难,要保持当前位置,原因是scrollview的子类 @Anbu.Karthik 那么解决方案是什么 你能显示你尝试的屏幕截图吗 @Anbu.Karthik 请检查一下。我是 passogn 正确的数组索引并且它显示正确但是当我滚动它时它需要从数组中获取 2 个元素。并在集合视图中显示错误的对象。如果我在数组中选择 3 个对象并传递到集合视图并向右滚动,它应该在左侧显示 4 和 2。但它显示数组中的 2 @Anbu.Karthik 你检查过我有问题更新的屏幕截图吗 【参考方案1】:他们找到可见单元格的方式是正确的。 我怀疑你的情况
if (self.iscalledFromVideoLIst)
obj =self.array_VideoList[self.selectedIndexPath.row];
else
obj =self.array_VideoList[indexPath.row];
这可能会为您提供不同的索引路径。不知道你什么时候设置这个值 self.is calledFromVideoLIst
另一种方法是使用。 cell.labelVideoTitle.tag=indexPath.row; 但不要把它放在条件中。 并在您的
中访问标签标题- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
方法。
主要是你需要调试你的方法,看看你滚动的时候 indexPath 是什么,问题主要在这里。尝试在此处打印 indexPath.row,您将看到问题。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
【讨论】:
当我滚动时,它总是从数组中获取 2 个元素并显示在集合视图单元格中。但事实并非如此,当我滚动主集合视图数组索引时,应该在滚动时更新,无论是向右还是向左,所以在所有情况下,当我滚动时它需要 2 个数组索引。但我想要当前索引, 首先尝试调试你的 cellForItemAtIndexPath 方法,看看当你滚动时 IndexPath 会出现什么,这将引导你朝着正确的方向前进。如果没有这些信息,我将无法为您提供进一步的帮助。 我调试过,如果我来自 4 个元素,当我 scoll 时它只需要 2 个数组值 我调试了,传递的索引值是什么,滚动时得到的相同,并且相同的值被传递到索引路径处的行的单元格。但它应该是数组的下一个值 因此您的 indexPath.row 获得了相同的值。并且还要检查你的数组 self.array_VideoList 中的值是什么,希望你没有重置它并重新加载集合视图。它应该包含您的项目的所有值。因为您只在数组中获得 2 条记录,所以我对此表示怀疑,并且您的 numberOfItemsInSection 方法将返回 2 行。那么请检查您的阵列。【参考方案2】:我明白了,如果你想用 videoList 数据左右滚动。
正确的做法是当VC调用“viewDidLoad”时,最后一行添加:
[self.collectionView scrollToItemAtIndexPath:self.selectedIndexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
并编辑代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
if (collectionView ==self.collectionView)
VVCollectionCell *cell = (VVCollectionCell *)[self.collectionView dequeueReusableCellWithReuseIdentifier:@"VVCollectionCell" forIndexPath:indexPath];
// VVSystems *obj;
// if (self.iscalledFromVideoLIst)
//
// obj =self.array_VideoList[self.selectedIndexPath.row];
//
// else
//
// obj =self.array_VideoList[indexPath.row];
//
VVSystems *obj=self.array_VideoList[indexPath.row];
[self.collectionView flashScrollIndicators];
NSLog(@"Current Index Path--->%ld",(long)self.selectedIndexPath.row);
NSLog(@"Current Title--->%@",obj.title);
[cell.labelVideoTitle setText:obj.title];
[cell.imgVideo sd_setImageWithURL:[NSURL URLWithString:obj.iconImage]
placeholderImage:nil];
return cell;
else
childCollectionCell *cell2 = (childCollectionCell *)[self.childCollectionView dequeueReusableCellWithReuseIdentifier:@"childCollectionCell" forIndexPath:indexPath];
ChildAnimations *obj = self.array_ChildElements[indexPath.row];
[self.childCollectionView flashScrollIndicators];
[cell2.labelTitel setText:obj.tagName];
[cell2.imgbackGround sd_setImageWithURL:[NSURL URLWithString:obj.image]
placeholderImage:nil];
return cell2;
【讨论】:
如果我按照你的建议做,它会将选定的索引路径覆盖为 0 索引路径,因此第一个元素仅显示在之前的 videoList View COntroller 中选择的任何值 我不知道有没有看到,但我有两个想法:1、当你选择Video In Table时,你可以将Main Collection View滚动到selectedIndexPath;2、使用新的数据作为Main集合视图(当您选择 Video In Table 时,更改主集合视图的数据并刷新它) 当我滚动例如..我在视频列表数组中有 1,2,3,4,5。现在我从数组中选择了 3 个索引并传递给集合视图,它在集合视图的数组中显示了 3 个对象。现在,当我滚动右侧时,videolist 数组索引应该从 3 增加到第四,如果我滚动左侧,它应该从 3 减少到 2 请检查我更新的问题。我的问题是滚动主集合视图数组。 当你选择视频时,你能显示代码吗?以上是关于UICollectionView - 基于水平滚动更新数组 indexPath的主要内容,如果未能解决你的问题,请参考以下文章