Ios UITableView和UICollectionView更新新单元格问题

Ios UITableView和UICollectionView更新新单元格问题,ios,uitableview,uicollectionview,uistoryboard,Ios,Uitableview,Uicollectionview,Uistoryboard,我正在尝试使用UICollectionView,它是UITableViewCell的一部分 所以我面临的问题是,可见表格单元格的集合视图可以正常工作,但是当我开始滚动表格,表格开始创建新的单元格,在不可见的地方,我会遇到一些行为,复制第一个表格单元格。例如,我在第一个表视图单元格中滚动了集合视图,然后向下滚动了表视图,我看到的新单元格的状态与第一个单元格的状态相同。您可以在此处和此处查看源代码以了解我所说的内容。-[UITableViewCell prepareForReuse]-[UITabl

我正在尝试使用UICollectionView,它是UITableViewCell的一部分


所以我面临的问题是,可见表格单元格的集合视图可以正常工作,但是当我开始滚动表格,表格开始创建新的单元格,在不可见的地方,我会遇到一些行为,复制第一个表格单元格。例如,我在第一个表视图单元格中滚动了集合视图,然后向下滚动了表视图,我看到的新单元格的状态与第一个单元格的状态相同。您可以在此处和此处查看源代码以了解我所说的内容。

-[UITableViewCell prepareForReuse]

-[UITableViewCell prepareForReuse]

在CustomTableViewCell.h中具有UICollectionView属性,并将其绑定到Main.storyboard中。我们假设它是这样的:

@property (strong, nonatomic) UICollectionView *collectionView;
在ViewController.m中,更改CellForRowatineXpath方法,以便在需要时在UICollectionView中重新加载

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell"];

    [cell.collectionView reloadData];
    [cell.collectionView scrollRectToVisible:CGRectZero animated:NO];

    return cell;
}

当然,您需要在ViewController.m文件上导入
CustomTableViewCell.h

在CustomTableViewCell.h中具有UICollectionView属性,并将其绑定到Main.storyboard中。我们假设它是这样的:

@property (strong, nonatomic) UICollectionView *collectionView;
在ViewController.m中,更改CellForRowatineXpath方法,以便在需要时在UICollectionView中重新加载

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell"];

    [cell.collectionView reloadData];
    [cell.collectionView scrollRectToVisible:CGRectZero animated:NO];

    return cell;
}

当然,您需要在ViewController.m文件上导入
CustomTableViewCell.h

UITableView单元格中的重用标识符存在问题,如果在CellForRowatineXpath中使用单个单元格标识符,则会出现此问题

1。为每行使用动态单元格标识符,如下所示

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"CustomTableViewCell_%d",indexPath.row]];
}
2.在数组中存储每个集合视图的内容偏移,并重置集合视图内容偏移

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ......
    [cell.collectionView setContentOffset:scrollingPoint animated:NO];

    return cell;
}

UITableView单元格中的重用标识符存在问题,如果在CellForRowatineXpath中使用单个单元格标识符,则会出现此问题

1。为每行使用动态单元格标识符,如下所示

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"CustomTableViewCell_%d",indexPath.row]];
}
2.在数组中存储每个集合视图的内容偏移,并重置集合视图内容偏移

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ......
    [cell.collectionView setContentOffset:scrollingPoint animated:NO];

    return cell;
}

ok属性工作良好,即使我重新加载集合视图,它仍保持在相同的位置,至于此行为,毫无疑问,因此据我所知,我需要手动执行。像设置初始状态?正如Dave所写的,似乎已经准备好了,我在寻找什么?您的单元格已出列,这意味着当您滚动以获得更好的性能时,相同的单元格将重新定位。假设您的表视图有1000行,但您只能同时看到其中的10行。内存中只有10行就足够了。所以,我用滚动到顶部代码编辑了我的答案。我认为你和戴夫的答案很好。所以,若我自己在委托方法或prepareForReuse的回调中设置它,那个么只有一个区别。但这里有一个问题,我认为,例如,如果每次都重置集合视图,那么我们滚动的第一个单元格的集合视图也会重置位置,当我们返回时。在这种情况下,我需要行为来保持第一个单元格的状态,但创建一个具有初始状态的新单元格。我将面临重置问题,这将适用于每个新单元格。ok属性工作良好,即使我重新加载集合视图,它仍保持在同一位置,至于此行为,毫无疑问,因此据我所知,我需要手动执行。像设置初始状态?正如Dave所写的,似乎已经准备好了,我在寻找什么?您的单元格已出列,这意味着当您滚动以获得更好的性能时,相同的单元格将重新定位。假设您的表视图有1000行,但您只能同时看到其中的10行。内存中只有10行就足够了。所以,我用滚动到顶部代码编辑了我的答案。我认为你和戴夫的答案很好。所以,若我自己在委托方法或prepareForReuse的回调中设置它,那个么只有一个区别。但这里有一个问题,我认为,例如,如果每次都重置集合视图,那么我们滚动的第一个单元格的集合视图也会重置位置,当我们返回时。在这种情况下,我需要行为来保持第一个单元格的状态,但创建一个具有初始状态的新单元格。我将面临重置问题,这将适用于每个新单元。谢谢您的回答。我可以在故事板中使用它吗?在您的示例中,您使用的是CustomTableViewCell_Ud,通过编程传递整数值没有问题。但是我应该在故事板中设置哪个标识符呢?注意:在-scrollViewDidScroll中,检查传递的[scrollview isKindOfClass:[UICollectionView类]],然后将该scrollview.contentOffset.x存储在一个数组中,并向您询问答案。我可以在故事板中使用它吗?在您的示例中,您使用的是CustomTableViewCell_Ud,通过编程传递整数值没有问题。但是我应该在故事板中设置哪个标识符呢?注意:在-scrollViewDidScroll中,检查传递的[scrollview isKindOfClass:[UICollectionView类]],然后将该scrollview.contentOffset.x存储在一个数组中