带有Parse对象的UITableView

时间:2015-02-16 19:45:43

标签: ios uitableview parse-platform

我是使用Parse和iOS的新手。我正在创建一个应该用Parse对象填充的UITableView。这是方法:

- (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为空。

我做错了什么?

谢谢。

3 个答案:

答案 0 :(得分:2)

我的猜测是查询时间与构建视图。而不是......

- (void)viewDidLoad {
    [super viewDidLoad];

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

......做这个......

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

这样,我们确定地知道在查找完成后所有视图都已构建并准备就绪。

答案 1 :(得分:1)

方法“findObjectsInBackgroundWithBlock”是否在单独的线程中运行? 如果是这样,你可能会在主线程以外的线程中调用[self.tableView reloadData],这不是一个好主意。

答案 2 :(得分:1)

试用ParseUI repository,它提供了从解析中获取数据的常用Cocoa Touch类。

如果您最终使用它,您需要实现的只是以下方法:

  • (PFQuery *)queryForTable
  • (UITableViewCell *)tableView: cellForRowAtIndexPath: object:
  • 和其他想要的UITableViewDelegate方法

如果要更新tableView,只需致电[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