UITableView重新加载部分

时间:2011-11-29 06:29:12

标签: iphone uitableview

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

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

11 个答案:

答案 0 :(得分:69)

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];
}

答案 1 :(得分:33)

是的,有:

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

答案 2 :(得分:24)

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

*** 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];
}

答案 3 :(得分:11)

对于Swift 3和Swift 4

let sectionToReload = 1
let indexSet: IndexSet = [sectionToReload]

self.tableView.reloadSections(indexSet, with: .automatic)

答案 4 :(得分:6)

正确的方法:

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

答案 5 :(得分:4)

基于此处接受的答案,我创建了一个函数,它将使用动画重新加载表格中的所有部分。这可能通过仅重新加载可见部分来优化。

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

就我而言,我必须在节动画之前强制执行reloadData,因为表的基础数据已经改变。然而,它适当地动画。

答案 6 :(得分:2)

你需要这个... For Reload Row

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

或For Reload部分

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

答案 7 :(得分:2)

尝试使用

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

希望这能解决您的问题。

答案 8 :(得分:2)

以下是方法,您可以通过不同方式传递部分详细信息

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

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

重新加载特定部分可以提高表视图的性能,同时还可以避免一些问题,例如在视图中浮动/移动自定义页眉。因此,尽可能尝试使用reloadSection而不是relaodData

答案 9 :(得分:0)

如果您有自定义剖面视图,则可以在视图控制器中添加弱参考,并随时更新。这是我的参考代码:

@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];
}

答案 10 :(得分:0)

但是您只能重新加载包含相同行数的节(或者您必须手动添加或删除它们)。否则,您将收到NSInternalInconsistencyException。

步骤:

  1. 计算要删除和/或插入的行
  2. 根据这些信息生成一个IndexPath数组
  3. 调用相关的tableView方法

现在您可以放心地调用reloadSections了:) Reload部分将调用其余索引的更新。

或者您可以使用类似https://github.com/onmyway133/DeepDiff

的库

快速伪代码:


        tableView.deleteRows(at: valueIndexesToRemove, with: .automatic)
        tableView.insertRows(at: valueIndexesToInsert, with: .automatic)
        tableView.reloadSections(IndexSet([section]), with: .automatic)