重新加载 UITableView 数据并向下滚动到最后选择的单元格

Posted

技术标签:

【中文标题】重新加载 UITableView 数据并向下滚动到最后选择的单元格【英文标题】:Reload UITableView data and scroll down to last selected cell 【发布时间】:2015-08-10 11:16:01 【问题描述】:

我有一长串数据要显示在UITableView 中。表格的一个单元格包含许多内容,例如 cmets、share 和 like。现在,当用户喜欢单元格中的帖子时,reloadTableData 并再次移动到第一个。例如,用户向下滚动到 30 个单元格,然后像第 29 个单元格一样,它会重新加载数据并继续再次回到顶部。那么如何使它在重新加载数据后保持在同一位置?这是我的代码:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

        return imagesArr.count;

对于喜欢按钮的实现

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

HomeCell *cellObj = (HomeCell*)[tableView dequeueReusableCellWithIdentifier:@"HomeCell" ];
cellObj.likeBtn.tag=indexPath.row;
[cellObj.likeBtn addTarget:self action:@selector(loveButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
return cellObj;
    

loveButtonClicked 按钮被点击。

-(void)loveButtonClicked

    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];

    NSDictionary *dict = [[NSDictionary alloc]initWithObjectsAndKeys:nil, nil];
    [[RRDataAcessLayer sharedDataAccessLayerManager]sendRequestToFetchHomeData:dict];
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeAnnularDeterminate;
   // hud.labelText = @"Loading Data";


下面的图片会给你一个想法。给出了两个单元格,当点击心形图标时,它会重新加载以更新总爱的值。

【问题讨论】:

请添加您的代码 @hasan83 检查我更新的问题。 添加loveButtonClicked代码 如果我的建议对您有用,请接受我的回答,也可以帮助其他人。谢谢 我为你做了一个演示应用程序分享我你的电子邮件我会发给你 【参考方案1】: 在变量中保存已编辑的索引 获取该索引的索引路径 在将数据重新加载到该索引后滚动到表
NSIndexPath* ip = [NSIndexPath indexPathForRow:editedRowNumber inSection:0];
    [self.tableViewTimeline scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:YES];
如果您的表格视图有一个部分,您可以传递零,如果您必须传递用户编辑单元格所在的部分,那么您可以传递零

在类似按钮操作中,您可以使用两种方式在不滚动的情况下重新加载单元格,而最好按照@Mhesh 的建议重新加载选定的索引

    int selectedIndex=(int) btn.tag;
    int likes = [[self.arrayDataSource objectAtIndex:selectedIndex] intValue]+1;
    [self.arrayDataSource replaceObjectAtIndex:selectedIndex withObject:[NSString stringWithFormat:@"%d",likes]];
    NSIndexPath* ip = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
    /*
    [self.refWeakTableView reloadData];
    [self.refWeakTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionNone animated:YES];
     */
    [self.refWeakTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:ip]withRowAnimation:UITableViewRowAnimationNone];

and cell for row method set like button tag

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"MyTableViewCell";

    myTableViewCell *cell = (myTableViewCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"myTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    
    //    DataSourceModel* dbObject = (DataSourceModel*)[self.arrayDataSource objectAtIndex:indexPath.row];
    cell.myCellLabel.text = [NSString stringWithFormat:@"%@",self.arrayDataSource[indexPath.row]];
    int indexed = (int)indexPath.row;

    cell.btnLike.tag = indexed;


    return cell;

【讨论】:

这可能会解决问题。但是,它首先不应该存在。表格视图应保持其滚动位置。这是 ios 上的默认行为 那么你可以使用scrollPosition选项UITableViewScrollPositionNone【参考方案2】:

如果操作就像影响一个单元格,那么为什么要重新加载整个表格,请使用以下代码重新加载唯一的单个单元格

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

您可以更改UITableViewRowAnimation

【讨论】:

这似乎合乎逻辑。让我试一试。 你用过脸书应用吗?那么当你喜欢某样东西时,Facebook 是如何做到这一点的呢?您提供的解决方案可能有效,但应用程序中发生了很多事情,我无法弄清楚该代码的放置位置。因为在cellForRowAtIndexPath 我没有重新加载数据。 当你喜欢这个按钮并且它在这个函数中调用函数时,你必须根据触摸的like按钮找到tableview的索引路径,然后编写你的所有逻辑,并在函数结束时编写上面的代码。 【参考方案3】:

我建议将当前选择缓存在控制器中的 didSelectedCellAtIndexPath 中,如果您重新加载整个表格,您可以使用 tableView 的滚动方法滚动到最后一个缓存的 indexPath。 :)

【讨论】:

【参考方案4】:

您不应该重新加载所有表数据,而应该只重新加载您想要的行。你可以通过在tableView上调用这个方法来做到这一点reloadRowsAtIndexPaths(_:withRowAnimation:) 它只会重新加载具有所需动画的所需单元格,而无需滚动到表格视图的顶部

【讨论】:

以上是关于重新加载 UITableView 数据并向下滚动到最后选择的单元格的主要内容,如果未能解决你的问题,请参考以下文章

重新加载uitableview后滚动表格视图

一直向下滚动到 UITableView 的底部

如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]

在 UITableView 中缓存图像

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容

向下滚动 uitableview 时,UIView 无法正确显示