заполнить UITableView

Я борюсь с UITableView, который у меня раньше работал, и каким-то образом я его сломал! Это часть курса Пола Хегарти.

Симптом заключается в том, что представление загружается, но оно пустое. Я явно неправильно понимаю что-то довольно простое.

Насколько я понимаю, два ключевых метода: 1 количество строк раздела, которое в моем случае возвращает ноль, что, как я знаю, неверно!

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


 {


 //   #warning Incomplete method implementation.
    // Return the number of rows in the section.
    NSLog(@"TopPlaces %@",self.topPlaces);
    //return 100;
    return [self.topPlaces count];

   }

Из-за вышеизложенного следующий метод никогда не вызывается, потому что нет строк.

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

А второй находится в ViewDidLoad, где я могу записывать свои данные в консоль, и все выглядит нормально. то есть мои данные генерируются в ViewDidLoad

- (void)viewDidLoad


 {
        [super viewDidLoad];

    dispatch_queue_t    dowloadQueue = dispatch_queue_create("flick downloader", NULL);
    dispatch_async(dowloadQueue, ^{
        NSArray *topPlaces = [FlickrFetcher topPlaces];
        //NSLog(@"Array is %@",topPlaces); // array is OK here
        dispatch_async(dispatch_get_main_queue(), ^{
            NSSortDescriptor *woeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_content" ascending:YES];  
            NSArray *woeDescriptors = @[woeDescriptor];
            NSArray *sortedReturns = [topPlaces sortedArrayUsingDescriptors:woeDescriptors];
            self.topPlaces = sortedReturns;
            //all the data is present here, count is 100 and array will log to console
           NSLog(@"count here is %u",[self.topPlaces count]);
        });
    });

    // Uncomment the following line to preserve selection between presentations.
    self.clearsSelectionOnViewWillAppear = NO;

}

person nerak99    schedule 01.11.2012    source источник


Ответы (2)


Проблема в том, что вы делаете асинхронный вызов для выборки данных (это означает, что ваш массив должен быть заполнен данными в какой-то момент в будущем), но после этого вы не перезагружаете представление таблицы. Вызов reloadData поможет:

 ...            
self.topPlaces = sortedReturns;
//all the data is present here, count is 100 and array will log to console
NSLog(@"count here is %u",[self.topPlaces count]);

[self.tableView reloadData]; // Assuming that 'tableView' is your outlet

Это заставит ваше табличное представление еще раз запросить свой источник данных и в конечном итоге загрузит все данные в ваш (теперь непустой) массив topPlaces.


Дополнительное объяснение:

Я увидел в комментарии @nerak99, что он не совсем уверен, почему проблема исправлена ​​с помощью reloadData. Ну, давайте использовать пример:

Представьте, что у вас есть ресторан.

Вы открываете заведение в 06:00 утра и видите, что вам нечего готовить. Итак, вы просите одного из ваших парней пойти на рынок за припасами (это ваш асинхронный звонок).

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

Теперь в 07:00 парень, который ходил на рынок, возвращается с 10 предметами. Какой следующий логический шаг для обновления вашего меню? На самом деле информировать официантку (это ваш reloadData) о товарах, которые вы вернули.

Я надеюсь, что это имеет смысл :)

person Alladinian    schedule 01.11.2012
comment
Люблю аналогию с рестораном. +1. - person Cyrille; 02.11.2012

Что такое self.topPlaces? Попробуйте NSLog массив и посмотреть, есть ли какое-либо содержимое. Если нет, убедитесь, что он установлен.

Я смогу написать более конкретный ответ, если вы предоставите больше информации.

person IluTov    schedule 01.11.2012
comment
Да, я мог нормально регистрировать содержимое. Из предоставленного и принятого выше ответа я понимаю, что, поскольку я выполнял асинхронный вызов, представление таблицы просто продолжалось и загружалось без результатов этого вызова в массиве. Данные перезагрузки исправили эту проблему, я не совсем уверен, почему, но вот так. - person nerak99; 02.11.2012
comment
@nerak99 См. мое редактирование Дальнейшее объяснение. Это должно прояснить для вас ситуацию. - person Alladinian; 02.11.2012