重新加载UITableView数据而不重新加载视图?

时间:2011-10-11 07:31:12

标签: iphone ios uitableview core-data

我有一个UITableView,其中包含一系列项目,每次通过方法refreshRows加载表格时,我都会从网络应用中获取这些项目。在我这样做后,我重新加载表。

当我将一个项目添加到我的表中时,我发现自己收到一条消息“无效更新:部分中的行数无效”。重新加载表中的数据是必要的,因此我从旧的viewDidAppear方法进行了更改(如下所示)。我现在有两个reloadData次调用,这些调用都刷新了我的观点。

问题:有更清洁的方法吗?添加后我需要重新加载我的数据,但我不想重新加载视图,直到获取Web上的所有状态。

- (void)viewDidAppear:(BOOL)animated // new
{
    NSLog(@"viewDidAppear");
    [super viewDidAppear:animated];

    [self.tableView reloadData]; // <------------- Prettier way to do this?
    [self refreshRows];
    [self.tableView reloadData];

}

- (void)viewDidAppear:(BOOL)animated // old
{
    NSLog(@"viewDidAppear");
    [super viewDidAppear:animated];

    [self refreshRows];
    [self.tableView reloadData];

}

- (void)refreshRows {
    // foreach row get status from webapp
}

编辑:

这是请求的代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

1 个答案:

答案 0 :(得分:4)

如果只有您的数据源知道更改(并且应该观察到这一点),您可能会尝试这样做:

  1. 注册TableView以观察数据源更新的通知中心。
  2. 从数据源向NSNotificationCenter发布更新已发布的通知。
  3. 使用[self.tableView reloadData];
  4. 对TableView中的更新进行反应

    在数据源中:

    - (void) dataSourceChanged
    {
    
        // All instances of TestClass will be notified
        [[NSNotificationCenter defaultCenter] 
            postNotificationName:@"myUniqueDataSourceChanged" 
            object:self];
    
    }
    

    在表视图控制器中:

    - (void)viewDidAppear:(BOOL)animated // new
    {
        NSLog(@"viewDidAppear");
        [super viewDidAppear:animated];
    
        [self.tableView reloadData]; // <------------- Prettier way to do this?
        [self refreshRows];
        [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(receiveNotification:) 
            name:@"myUniqueDataSourceChanged"
            object:self.dataSource];
    }
    
    - (void) receiveNotification:(NSNotification *) notification
    {
        if ([[notification name] isEqualToString:@"myUniqueDataSourceChanged"])
            [self dataSourceHasBeenChanged];
    }
    
    - (void) dataSourceHasBeenChanged
    {
    
        [self.tableView reloadData];
        [self refreshRows];
    }
    

    这将自动更新每次数据源更新时的表视图