2012-03-22 3 views
5

Вот моя перезарядка функцияIOS UITableView reloadData только обновляет таблицу второй раз, когда я называю мой перезарядка функция

- (void) reloadTable:(id)sender 
{ 
    NSLog(@"Reload Table"); 
    NSLog(@"%@",[appDelegate queryList]); 
    [self.driverTable reloadData]; 
    [self.driverTable setNeedsLayout]; 
    [self.driverTable setNeedsDisplay]; 
} 

Вот где я называю это после получения данных от веб-сервиса

if([elementName isEqualToString:@"Response"]) { 
    Response = NO; 
    LookupView *lookupView = [[LookupView alloc] initWithNibName:@"LookupView" bundle:nil]; 
    [lookupView reloadTable:self]; 
} 

Неполадка прямо сейчас, после того, как я выполнил поиск, нажав кнопку поиска и получив данные. Таблица не обновляется новыми данными. Если я снова вызову ту же функцию, снова нажав кнопку поиска, таблица перезагрузится. Теперь я знаю, что данные есть, потому что я печатаю массив, прежде чем я вызову перезагрузку таблицы.

Любые идеи, почему?

+0

Зачем вам нужно setNeedsLayout и setNeedsDisplay? UITableViews не нуждаются в перерисовке, они сами обрабатывают это время перезагрузки. – CodaFi

+0

О, я просто изучал решения здесь, некоторые люди с подобными проблемами упомянули это, поэтому я просто пытался –

+0

Удалите эти методы, упомянутые @CodaFi. Он не принадлежит к ним. –

ответ

6

Я столкнулся с той же проблемой. Для документации Apple, reloadData "не следует вызывать в методах, которые вставляют или удаляют строки." Обходной путь, который я использовал, - это задержать вызов reloadData, чтобы он не сразу после обновления таблицы. Попробуйте это:

[self performSelector:@selector(delayedReloadData) withObject:nil afterDelay:0.5]; 

в соответствующем месте с последующим осуществлением delayReloadData

-(void)delayedReloadData{ 
    [self.tableView reloadData]; 
} 

Отрицательный побочный эффект я вижу от этого подхода является то, что если строка таблицы видна есть небольшая задержка прежде чем он покажет свое содержание.

+0

Это, казалось, сработало для меня спасибо –

+0

[this] (http://stackoverflow.com/questions/14018754/why-reloaddata-shouldnt-be-called-on-methods-that -delete-insert-rows) вопрос может засчитываться как ответ на ответ @ bobnoble – abbood

0

Я выяснил, что вы выполняете разбор XML, видя, что elementName в вашем if loop. Зачем вам нужен load a NIB file в вашем анализируемом коде. Какая польза от этого? Вы можете просто вызвать свой метод reloadTable: именно так.

[self reloadTable:self]; 

Вы заселять свой Tableview используя некоторый массив в файле app delegate. Итак, вы инициализировали своего делегата в своем ViewController?

+0

Да, вы правы, я заполняю массив, который содержит данные для таблицы, используя делегат приложения. Как только я знаю, что вся информация загружается в массив, я использую делегат приложения для вызова функции таблицы обновления в контроллере представления таблицы. –

+0

неправильное сообщение ... –