重新加载 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 数据并向下滚动到最后选择的单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]