2015-02-10 2 views
1

Я борюсь с методами datasource и делегата tableview. У меня есть табличное представление, если пользователь перейдет к этому контроллеру табличного представления. Я вызываю метод веб-службы, который является блочным сервисом после того, как запрос завершил успешную перезагрузку разделов таблицы, но tableView: cellForRowAtIndexPath: indexPath, вызываемый дважды. Вот мой код.UITableview делегат и источник данных, вызываемый дважды

viewDidLoad

[[NetworkManager sharedInstance].webService getValues:self.currentId completion:^(NSArray *result, BOOL handleError, NSError *error) { 

    self.data = result[0]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 4)] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    }); 

} 

но значение cellForRowAtIndexPath self.data является недействительным в первый раз.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     NSLog(@"%@", self.data); // first time it print null 
} 

Итак, есть ли идеи по этому поводу? Спасибо огромное!

+0

Методы dataSource вашего 'UITableView' будут вызываться после того, как экран будет загружен в качестве предложенного @Kex, поэтому в первый раз это« null », и во второй раз перезагрузка данных будет вызвана изнутри вашего асинхронный блок. – Levi

+0

попробуйте поместить код reloadSections чуть ниже self.data = result [0]; а не в блок отправки. – Kex

+0

@ Kex Я старался изо всех сил. –

ответ

3

Вы инициализировали массив данных в viewDidLoad? Если вы этого не сделали, он вернет null.

, если вы хотите, чтобы избежать двух вызовов в Tableview попробовать это:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    if(!data) 
     return 0; 

    return yourNumberOfSections; 
} 
+0

Извините, данные не являются массивом. но в любом случае, если вы не инициализировали ни это, ни массив результатов, он возвращает null. – Kex

+0

Извините. Я знаю это. Но его нужно заполнить из api. –

0

Это звучит как -tableView:cellForRowAtIndexPath: вызывается просто потому, что загружается вид и таблица пытается заполнить себя, прежде чем вы получили любые данные из вашего веб-сервиса. В этот момент вы не будете устанавливать self.data (что бы это ни было) на любое полезное значение, поэтому вместо этого вы получите null. Когда ваш веб-сервис возвращает некоторые данные, процедура завершения вызывает перезагрузку соответствующих разделов, и таблица рисует данные.

1

Табличный вызов вызывает cellForRowAtIndexPath, когда ему нужно отобразить ячейку на экране. Если представление таблицы появляется до того, как оно будет иметь какие-либо данные, self.data будет пустым.

В viewDidLoad установлен [[self.data = NSMutableArray alloc] init] (к примеру) и в datasource/delegate методов UIITableView он должен правильно вернуть numberOfRows и т.д., как ноль, пока ваш веб-сервис не заполнит свои данные.

Смежные вопросы