我是使用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为空。
我做错了什么?
谢谢。
答案 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