UICollectionView - 基于水平滚动更新数组indexPath

时间:2016-08-01 06:53:43

标签: ios objective-c uicollectionview

您好我使用两个集合单元格来显示数据,子集合视图值基于主集合视图。

我有视频列表,当我选择Video In Table时,我在索引路径传递完整数组,以便根据所选的数组indexPath显示主集合视图。

它显示正常,但是当我水平滚动时,我传递可见单元indexPath数据来获取子集合View Data。

但是当我滚动主集合视图时,indexPath上的数组没有根据主集合视图进行更新它始终显示从视频列表传递的相同IndexPath(上一个视图控制器)。

如何根据水平滚动更新主集合视图数组。

我想要这种情况 -

例如,VIdeo列表数组是1,2,3,4

我选择3个索引并传递给视频列表数组的集合视图,它显示选定的索引路径行值,当我向右滚动时,索引路径应该增加到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;

}
}

enter image description here

2 个答案:

答案 0 :(得分:0)

我知道,如果你想用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;
}
}

答案 1 :(得分:0)

他们发现可见细胞是正确的。 我怀疑你的情况

if (self.iscalledFromVideoLIst)
    {
        obj =self.array_VideoList[self.selectedIndexPath.row];

    }
    else
    {
        obj =self.array_VideoList[indexPath.row];
    }

哪个可能会为您提供不同的索引路径。我不知道你何时设置这个值self.iscalledFromVideoLIst

使用不同的方法。 cell.labelVideoTitle.tag = indexPath.row; 但不要把它放在这个条件下。 并访问

中的标签标题
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

方法

主要是你需要调试你的方法,看看你滚动时的indexPath是什么,问题主要在这里。尝试在此处打印indexPath.row,您将看到问题。

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