重新加载UITableView数据并向下滚动到上次选定的单元格

时间:2015-08-10 11:16:02

标签: ios objective-c uitableview

我有一长串要在UITableView中显示的数据。表格的一个单元格包含许多内容,如评论,分享等。现在,当用户喜欢单元格中的帖子reloadTableData并再次移动到第一个帖子时。

例如用户已向下滚动到30个单元格然后像第29个单元格一样,它将重新加载数据再次登顶。

那么重装数据后如何让它停留在同一个地方?这是我的代码:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
        return imagesArr.count;
}

对于Like按钮

的暗示
- (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";

}

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

4 个答案:

答案 0 :(得分:2)

  • 在变量
  • 中保存已编辑的索引
  • 获取该索引的索引路径
  • 在reoladdata之后滚动到表格到该索引
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;
}

答案 1 :(得分:1)

如果对某个单元格的操作受到影响,那么为什么要重新加载整个表格,请使用下面的代码重新加载唯一的单个单元格

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

您可以更改UITableViewRowAnimation

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您不应重新加载所有表数据,而应仅重新加载所需的行。您可以通过在tableView reloadRowsAtIndexPaths(_:withRowAnimation:)上调用此方法来执行此操作 它将仅重新加载具有所需动画的所需单元格,而无需滚动到表格视图顶部