2014-01-31 2 views
3

Я пытаюсь отобразить некоторые массивы в UITableViewController. У меня есть пользовательская ячейка с NIB. Проблема, с которой я сталкиваюсь, - это то, что мои строки таблицы пытаются заполнить, прежде чем мои массивы будут загружены в мой ViewDidLoad. Установка точек прерывания показывают, что мои строки таблицы создаются и затем непосредственно после моих массивов приведены значения (которые установлены в моем ViewDidLoad.tableView cellForRowAtIndexPath: выполняется перед ViewDidLoad?

Может кто-нибудь сказать мне, почему метод tableView работает до ViewDidLoad? Что мне нужно сделать сделать, чтобы мои массивы загружены до строки таблицы заполняются

Вот мой ViewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"go"); 
    PFQuery *getCartQuery = [PFQuery queryWithClassName:@"chwCart"]; 
    [getCartQuery whereKey:@"userId" equalTo:[PFUser currentUser].objectId]; 
    [getCartQuery whereKey:@"status" equalTo:@"open"]; 

    [getCartQuery getFirstObjectInBackgroundWithBlock:^(PFObject *currentCartObject, NSError *error) { 

     // NSLog([currentCartObject objectId]); 

     currentCart = [currentCartObject objectForKey:@"cartContents"]; 

     dictFoodId = [currentCart valueForKey:@"foodId"]; 

     dictQty = [currentCart valueForKey:@"qty"]; 

    }]; 
    NSLog(@"Should be loaded"); 

     [self.tableView registerNib:[UINib nibWithNibName:@"foodCell" bundle:nil] forCellReuseIdentifier:@"foodCell"]; 


    } 

Вот мой tableView cellForRowAtIndexPath:

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

    static NSString *CellIdentifier = @"foodCell"; 
    foodCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    if (cell == nil) { 

     cell = [[foodCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 

    } 

    cell.foodTitle.text = [dictQty objectAtIndex:indexPath.row]; 


    return cell; 
} 

ответ

3

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

[getCartQuery getFirstObjectInBackgroundWithBlock:^(PFObject *currentCartObject, NSError *error) { 

     // NSLog([currentCartObject objectId]); 

     currentCart = [currentCartObject objectForKey:@"cartContents"]; 

     dictFoodId = [currentCart valueForKey:@"foodId"]; 

     dictQty = [currentCart valueForKey:@"qty"]; 

     [self.tableView reloadData]; 

    }]; 
3

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

**[self.tableView reloadData];** 

так что ваш код я n viewdidLoad должно выглядеть так:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
NSLog(@"go"); 
PFQuery *getCartQuery = [PFQuery queryWithClassName:@"chwCart"]; 
[getCartQuery whereKey:@"userId" equalTo:[PFUser currentUser].objectId]; 
[getCartQuery whereKey:@"status" equalTo:@"open"]; 

[getCartQuery getFirstObjectInBackgroundWithBlock:^(PFObject *currentCartObject, NSError *error) { 

    // NSLog([currentCartObject objectId]); 

    currentCart = [currentCartObject objectForKey:@"cartContents"]; 

    dictFoodId = [currentCart valueForKey:@"foodId"]; 

    dictQty = [currentCart valueForKey:@"qty"]; 
    [self.tableView reloadData]; 

}]; 
NSLog(@"Should be loaded"); 

    [self.tableView registerNib:[UINib nibWithNibName:@"foodCell" bundle:nil] forCellReuseIdentifier:@"foodCell"]; 


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