UITableView重载部分

我想重新加载只有一个部分不是整个表。 有没有在UITableView任何方法。

[tableView reloadData]用于加载全表。
我想知道如何只加载一个部分,因为我在表中有大量的行。

就在这里:

 - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 

reloadSections方法错误我 – 因为我必须构造一些对象。 如果您需要灵活性,这是非常好的,但有时我也只是想要简单。 它是这样的:

 NSRange range = NSMakeRange(0, 1); NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range]; [self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone]; 

这将重新加载第一部分。 我更喜欢在UITableView上有一个类别,只需调用这个方法:

 [self.tableView reloadSectionDU:0 withRowAnimation:UITableViewRowAnimationNone]; 

我的类别方法如下所示:

 @implementation UITableView (DUExtensions) - (void) reloadSectionDU:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation { NSRange range = NSMakeRange(section, 1); NSIndexSet *sectionToReload = [NSIndexSet indexSetWithIndexesInRange:range]; [self reloadSections:sectionToReload withRowAnimation:rowAnimation]; } 

但是,只能重新加载包含相同行数的部分(或者您必须手动添加或删除它们) 。 否则,你会得到:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 2. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (0), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

当你使用[tableView reloadData]时,这是不需要的。

当你需要重新加载一个部分,并且你改变了它里面的行数时 ,你可以使用像这样的东西:

 NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section]; [self beginUpdates]; [self deleteSections:indexSet withRowAnimation:rowAnimation]; [self insertSections:indexSet withRowAnimation:rowAnimation]; [self endUpdates]; 

如果你把它放在一个类别(如bandejapaisa节目),它可能是这样的:

 - (void)reloadSection:(NSInteger)section withRowAnimation:(UITableViewRowAnimation)rowAnimation { NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section]; [self beginUpdates]; [self deleteSections:indexSet withRowAnimation:rowAnimation]; [self insertSections:indexSet withRowAnimation:rowAnimation]; [self endUpdates]; } 

那正确的方法是:

 [self.tableView beginUpdates]; [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; 

基于这里接受的答案,我做了一个函数,将使用animation重新加载表中的所有部分。 这可能可以通过只重新加载可见部分来优化。

 [self.tableView reloadData]; NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:self.tableView]); NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade]; 

在我的情况下,我不得不在部分animation之前强制reloadData,因为表的底层数据已经改变。 然而,它正确的animation。

Swift 3和Swift 4

 let sectionToReload = 1 let indexSet: IndexSet = [sectionToReload] self.tableView.reloadSections(indexSet, with: .automatic) 

你需要这个…对于重新加载行

 - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

或对于重新加载部分

 - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 

这里是方法,你可以通过不同的方式传递部分细节

 [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:NO]; [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone]; 

重新加载特定的部分可以提高表视图的性能,同时也可以避免一些问题,如在视图中浮动/移动自定义页眉页脚。 所以尽可能使用reloadSection比relaodData

尝试使用

 [self.tableView beginUpdates]; [self.tableView endUpdates]; 

希望这将解决您的问题。

如果你有自定义部分视图,你可以在视图控制器中添加一个弱引用,并在需要的时候更新它。 这里是我的代码供参考:

 @property (weak, nonatomic) UILabel *tableHeaderLabel; .... -(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UITableViewHeaderFooterView *myHeader = [[UITableViewHeaderFooterView alloc] init]; UILabel *titleLabel = [[UILabel alloc] init]; [titleLabel setFrame:CGRectMake(20, 0, 280, 20)]; [titleLabel setTextAlignment:NSTextAlignmentRight]; [titleLabel setBackgroundColor:[UIColor clearColor]]; [titleLabel setFont:[UIFont systemFontOfSize:12]]; [myHeader addSubview:titleLabel]; self.tableHeaderLabel = titleLabel; //save reference so we can update the header later return myHeader; } 

之后,您可以像这样更新您的部分:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { self.tableHeaderLabel.text = [NSString stringWithFormat:@"Showing row: %ld", indexPath.row]; }