2015-02-16 3 views
0

Я новичок в Parse с iOS. Я создаю UITableView, который должен быть заполнен объектами Parse. Это методы:UITableView с элементами Parse

- (void)viewDidLoad { 
    [super viewDidLoad]; 


    [self performSelector:@selector(retrieveFromParse)]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void) retrieveFromParse { 

    PFQuery *retrieveColors = [PFQuery queryWithClassName:@"cadenas"]; 

    [retrieveColors findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     if (!error) { 
      colorsArray = [[NSArray alloc] initWithArray:objects]; 
      NSLog(@"descargado=%@",colorsArray); 
     } 
     [self.tableView reloadData]; 
    }]; 
} 

Предыдущий NSLog показывает два существующих объекта Parse.

А теперь методы просмотра таблицы:

#pragma mark - Table view data source 
- (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. 
    // Usually the number of items in your array (the one that holds your list) 
    return [colorsArray count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    //Where we configure the cell in each row 

    static NSString *simpleTableIdentifier = @"SimpleTableItem"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; 
    } 
    PFObject *tempObject = [colorsArray objectAtIndex:indexPath.row]; 
    NSLog(@"CADNA =%@:",[colorsArray objectAtIndex:indexPath.row]); 
    cell.textLabel.text = [tempObject objectForKey:@"chain_name"];; 
    return cell; 

} 

Последний NSLog не называется, и для этого, то UITableView пуст.

Что я делаю неправильно?

спасибо.

+0

вы установить делегат и источник данных о Tableview? – YuviGr

+0

@YuviGr, да, я сделал. Я тестировал его с помощью NSArray, и отображаются элементы массива. Спасибо. – mvasco

+0

где объявляется colorsArray? – YuviGr

ответ

1

Пробуйте ParseUI repository, который предоставляет обычно используемые классы Cocoa Touch, которые извлекают данные из синтаксического анализа.

Если вы в конечном итоге использовать его, все, что вам нужно реализовать эти методы:

  • (PFQuery *)queryForTable
  • (UITableViewCell *)tableView: cellForRowAtIndexPath: object:
  • И другие хотели UITableViewDelegate Методы

Если вы хотите обновите таблицуView, просто позвоните [self loadObjects];

Вот класс образец, который будет работать (taken from the ParseUI repo demo):

#import <ParseUI/ParseUI.h> 

@interface StoryboardTableViewController : PFQueryTableViewController 

@end 

И реализация:

#import "StoryboardTableViewController.h" 

#import <Parse/PFObject.h> 
#import <Parse/PFQuery.h> 

#import <ParseUI/PFTableViewCell.h> 

@implementation StoryboardTableViewController 

#pragma mark - 
#pragma mark Data 

- (PFQuery *)queryForTable { 
    PFQuery *query = [super queryForTable]; 
    [query orderByAscending:@"priority"]; 
    return query; 
} 

#pragma mark - 
#pragma mark TableView 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object { 
    static NSString *cellIdentifier = @"cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    } 

    cell.textLabel.text = object[@"title"]; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"Priority: %@", object[@"priority"]]; 

    return cell; 
} 

@end 
1

Является ли метод «findObjectsInBackgroundWithBlock» запущенным в отдельном потоке? Если это так, вы можете вызвать [self.tableView reloadData] в потоке, отличном от основного потока, что на самом деле не очень хорошая идея.

+1

Вы правы, но это возврат блока на основной поток – YuviGr

+0

Спасибо, понял, но тогда где я перезаряжаю табличный вид? – mvasco

+0

Я поместил NSLog в метод numberOfRowsInSection, и сначала выйдет вывод этого NSLog, затем NSLog из метода viewDidLoad, который должен означать, что представление таблицы заполнено до того, как данные будут получены из Parse, правильно? – mvasco

2

Мое предположение - это время запроса или построение представления. Вместо того, чтобы ...

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // remove this 
    [self performSelector:@selector(retrieveFromParse)]; 

... это сделать ...

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self retrieveFromParse]; 
} 

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

+0

Успех в вашем предложении. Тот же результат, NSLog (@ "descargado =% @", colorsArray); вызывается после numberOfRowsInSection ... ?? – mvasco

+0

Он вызывается после, но тогда мы должны увидеть, что источник данных снова вызван перезагрузкой. Это будет указывать на еще более простую проблему: розетка self.tableView не установлена. Как раз перед вызовом reload, NSLog (@ "% @", self.tableView) ;. Я думаю, что мое предложение в ответе по-прежнему целесообразно, но, может быть, проблема очень проста. – danh

+0

Спасибо, Данх, не получилось. Но я попытаюсь использовать PFQueryTableViewController, возможно, это решение. – mvasco

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