Инициализируйте UITableView с динамическими данными - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь отобразить список друзей в UITableView.

Я загружаю друзей:

- (void)viewDidLoad
{
  [super viewDidLoad];
  [self apiGraphFriends];
}

Затем я устанавливаю свои результаты в:

- (void)request:(FBRequest *)request didLoad:(id)result 
{
friends = [[NSMutableArray alloc] initWithCapacity:1];
NSArray *resultData = [result objectForKey:@"data"];
if ([resultData count] > 0) {
    for (NSUInteger i=0; i<[resultData count]; i++) {
        [friends addObject:[resultData objectAtIndex:i]];
    }
} else {
    //[self showMessage:@"You have no friends."];
}

}

и я реализую требуемый UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [friends count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:    (NSIndexPath *)indexPath
{
    //NSManagedObjectModel *friend [fetch

    FriendCell *cell = [tableView dequeueReusableCellWithIdentifier:   @"friendCell"];        

    cell.cellName.text = [friends objectAtIndex:indexPath.row];

return cell;
}

Проблема в том, что метод cellForRowAtIndexPath вызывается до получения моих данных. Как предотвратить автоматическую инициализацию табличного представления и только инициализировать его, когда у вас есть данные для него?

Ответы [ 7 ]

4 голосов
/ 07 ноября 2011

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

[self.tableView reloadData];

Это сообщает tableView, что нужно обновить, и снова вызывает cellForRowAtIndexPath и весь этот джаз.

2 голосов
/ 07 ноября 2011

как предотвратить автоматическую инициализацию табличного представления

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

и инициализировать его только тогда, когда у вас есть данные для него.

Отправить сообщение reloadData в табличное представление после полученияготов.

1 голос
/ 28 марта 2014

Не устанавливайте делегат табличного представления и источник данных, пока ПОСЛЕ ваших данных.

т.е.

-(void)viewDidLoad{
     [self apiGraphFriends];
     self.tableview.delegate = self;
     self.tableview.datasource = self;
}

Я предполагаю, что ваш метод apiGraphFriends не использует фоновую многопоточность и не является асинхронным. Если это так, то просто создайте новый метод и поместите туда параметр источника данных / делегата, затем вызовите его из блока в вашем методе apiGraphFriends.

1 голос
/ 07 ноября 2011

Ваш numberOfRowsInSection должен вернуть 0, если вам нечего отображать.После того, как данные загружены и готовы к отображению, вы должны вызвать reloadData для tableView, и только тогда данные должны отображаться.numberOfRowsInSection теперь должно давать количество загруженных вами строк.

Короче говоря, вы не препятствуете инициализации tableView.Сначала вы указываете, чтобы данные не отображались, а после загрузки данных вы указываете на отображение столько строк, сколько у вас есть.

1 голос
/ 07 ноября 2011

Вы не забыли изменить количество секций с 0 до хотя бы 1?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

Чтобы полностью проверить это, вы можете использовать следующий код

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Add your friend as you initialise the array
    NSMutableArray *array = [NSMutableArray arrayWithObjects:f1,nil];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [self.friends count];
}

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

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

    //change this to whatever you need
    NSString *friend = [self.friends objectAtIndex:indexPath.row];  
    cell.textLabel.text = friend;

    return cell;
}
0 голосов
/ 07 ноября 2011

Ты так близко!

- (void)viewDidLoad
{
  [self apiGraphFriends];
  [super viewDidLoad];
}

Это должно сделать это. Если нет, вы всегда можете вызвать reloadData для tableView.

0 голосов
/ 07 ноября 2011

просто вызовите reloadData tableView, как только вы получите ваши данные, tableview перезагрузит свои данные и, таким образом, вызовет все ваши источники данных для получения своих данных.

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