2014-02-20 9 views
1

У меня возникла странная проблема, и я уверен, что я делаю что-то неправильно. В моем классе UITableViewController У меня есть функция следующим образом:UITableViewCell Не отображает загруженные данные, но отображает их при выборе

-(void)EERefreshView 
{ 
    NSLog(@"App delegate requested the view be refreshed"); 
    [self loadEventsFromDB]; 

    for(int a=0;a<eventsList.count;a++) 
    { 

     DB_EEEvent *event = (DB_EEEvent*)eventsList[a]; 
     UITableViewCell *cell = 
     [self.tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
     //NSLog(@"CellID %@", cell.reuseIdentifier); 


     //get references to the UI components 
     UILabel *lblTitle = (UILabel*)[cell.contentView viewWithTag:5]; 
     UILabel *lblDate = (UILabel*) [cell.contentView viewWithTag:6]; 
     UIImageView *imgEvent = (UIImageView*)[cell.contentView viewWithTag:7]; 

     //set values 
     lblTitle.text = event.name; 

     lblDate.text = [NSString stringWithFormat:@"%@ - %@", 
         event.startdate,event.enddate]; 

     AppDelegate *del = [AppDelegate sharedAppDelegate]; //need this to get the BaseURL 

     // Here we use the new provided setImageWithURL: method to load the web image 
     NSString * imageURL =[[NSString alloc] initWithFormat:@"http://%@%@",del.api.BaseURL,event.logo]; 
     NSString* webStringURL = [imageURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSURL *url = [NSURL URLWithString:webStringURL]; 

     [imgEvent setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.png"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
      //do somethign when image call completes 
     }]; 

     [eventsListCells addObject:cell]; 

     if(a == selectedEvent) 
     { 


     } 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [tblEventsList reloadData]; 
    }); 

} 

Эта функция загружает массив объектов UITableViewCell, который затем используется в дальнейшем при

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Configure the cell data 
    NSLog(@"IndexPathRow: %d", indexPath.row); 
    UITableViewCell *cell = (UITableViewCell*)eventsListCells[indexPath.row]; 
    return cell; 


} 

Однако, когда клетка загружается lblTitle и lblDate есть в них не отображается текст. Но когда я нажимаю на ячейку, он отображает текст в ярлыках. Таким образом, это означает, что данные есть, но не обновляются при первоначальном создании. Я подозреваю, что это может быть связано с потоками, но я не эксперт по этому вопросу и буду признателен за любую помощь, которую я могу получить.

+1

Почему вызов '[tblEventsList reloadData];' в диспетчерах async? – HRM

+0

@HRM Поскольку пользовательский интерфейс TableView обновляется в основном потоке. Если я не использую это, представление таблицы не будет обновляться автоматически и остается пустым, пока я не прокручу его. Кстати, я попытался вызвать [tblEventList reloadData] без блока асинхронизации, и даже после прокрутки текст не загружается, если я не нажму на ячейку. Кажется, что это связано с нажатием кнопки –

+0

, чтобы использовать 'dequeueReusableCellWithIdentifier' с другим идентификатором. например '[self.tableView dequeueReusableCellWithIdentifier: [NSString stringWithFormat: @" Cell_% i ", a]];' –

ответ

1

Я вижу, что вас беспокоит и почему вы создали этот метод, но он вам не нужен. Единственная причина, по которой вам нужен обратный поток, - это загрузка вашего изображения, чтобы его нужно было выбросить в bkg. нить и остальная часть коды должна быть -

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. 

U действительно не нужен предварительно создать клетки, и U наклоняет причину они могут быть использованы повторно. Например, если у вас есть 50 элементов в eventsList и комната для всего 5 клеток на вашем экране, вы не можете создать 50 ячеек, потому что код будет создавать только 5 + 1 и повторно использовать их, как они появляются на экране, поэтому каждый элемент вашего списка событий будет использовать одна из этих 5 ячеек, а с другой стороны каждая ячейка будет хостом для 10 различных элементов из вашего массива eventsList. Таким образом, вы можете видеть, что ваш код не имеет особого смысла ...

+0

@AntonioDev Спасибо, что имеет смысл, но тогда почему он показывает данные, когда я нажимаю на него? –

+1

Я действительно не знаю, но ваша проблема тривиальна и «уже выполнена» в большинстве UITableViews там, поэтому я действительно не вижу смысла отлаживать ваш код, читать документы, google, я уверен вы найдете множество функциональных примеров ... Попробуйте класс IconDownloader (у вас есть он на GitHub), изучите пример и все. Вы будете многократно использовать этот код много раз ... – AntonijoDev

+0

Согласен. Спасибо за понимание этого вопроса. –

0

Вторая функция, которую вы упомянули в своем вопросе, - это функция, которая вызывается для заполнения таблицы данными. Когда вы вызываете [tblEventsList reloadData];, ваше приложение просто вызывает метод (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath. Поэтому этот метод должен выводить данные обратно в таблицу. Ниже приведен очень простой пример. Кроме того, убедитесь, что установлен делегат таблицы и источник данных.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView 
     dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] 
      initWithStyle:UITableViewCellStyleDefault 
      reuseIdentifier:CellIdentifier]; 
    } 

    // Configure the cell. 
    cell.textLabel.text = [self.your_data_source objectAtIndex:[indexPath row]]; 
    return cell; 
} 
+0

Спасибо @Kyle. Я знаю, что reloadData фактически вызывает cellForRowAtIndex. Проблема, с которой я сталкиваюсь, заключается в том, что я уже создал массив ячеек, которые я хочу использовать. Когда я возвращаю одну из ячеек из этого массива в мою функцию cellForRoWAtIndex, он не загружает текст из него. –

+1

-1: Его реализация этого метода * * возвращает ячейки к таблице, они уже были созданы в другом месте. –

+0

Это кажется очень странным, как быстрый отладочный совет, распечатать свой массив в методе cellForRowAtIndexPath. Убедитесь, что он выделен и не равен нулю. Там может быть какая-то странная проблема, когда массив имеет значение null при загрузке, но затем устанавливается, когда пользователь не выполняет никаких действий. – Kyle

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