我有一长串要在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";
}
答案 0 :(得分:2)
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:)上调用此方法来执行此操作 它将仅重新加载具有所需动画的所需单元格,而无需滚动到表格视图顶部