Перезагрузить данные UITableView без перезагрузки представления? - PullRequest
2 голосов
/ 11 октября 2011

У меня есть UITableView, который содержит набор элементов, статус которых я получаю из веб-приложения каждый раз, когда таблица загружается с помощью метода refreshRows.После этого я перезагружаю таблицу.

Когда я добавил элемент в свою таблицу, я обнаружил, что получаю сообщение «Неверное обновление: недопустимое количество строк в разделе».Перезагрузка данных в таблице оказалась необходимой, поэтому я сделал переход от старого к новому viewDidAppear методам (оба показаны ниже).Теперь у меня два reloadData звонка, которые оба освежают мой взгляд.

ВОПРОС: Есть ли более чистый способ сделать это?После добавления мне нужно перезагрузить мои данные, но я бы предпочел не перезагружать представление, пока не будут получены все статусы из Интернета.

- (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 Ответ

4 голосов
/ 11 сентября 2012

Вы можете попытаться сделать это, если только ваш источник данных знает об изменениях (и должен соблюдать этот пункт):

  1. Зарегистрируйте свой TableView для наблюдения за центром уведомлений об обновлениях источника данных.
  2. Отправьте уведомление из источника данных в NSNotificationCenter, что пришло обновление.
  3. Реагирует на обновление в TableView с [self.tableView reloadData];

В источнике данных:

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

Это автоматически обновит ваше табличное представление при каждом обновлении источника данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...