显示从UITableView中的Parse检索的数据

时间:2013-05-17 12:35:20

标签: objective-c uitableview parse-platform

在我用你的答案取得所有进展后,我的问题发生了变化。所以我以更清晰的方式改变我的问题。我有一个UITableView,它显示我从Parse.com检索到的数据。所以我创建了一个NSMutableArray,用于在检索它们时向该数组添加对象。但我的问题是,即使我添加对象NSMutableArray,我的表没有显示任何东西,但UITableView的默认屏幕。我的问题是UITableView是在我的NSMutableArray得到它的对象之前形成的。这是我的代码:

注意:PropertyClass是具有my对象属性的类。

在MyTableViewController.h

@interface MyTableViewController : UITableViewController  <CLLocationManagerDelegate>  { 
    PFObject *object;
}
@property (strong, nonatomic) IBOutlet UITableView *MyTableView;
@end

在UITableViewController.m

@interface MyTableViewController ()
@property(strong)NSMutableArray *myNSMutableArray;
@end


@implementation MyTableViewController
@synthesize myNSMutableArray,MyTableView;

-(void) retrievingDataFromParse{
    PFQuery *query = [PFQuery queryWithClassName:@"MyObjectsClass"];
    [query whereKey:@"ObjectsNumber" lessThanOrEqualTo:10];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);

            if (objects.count==0) {
                NSString *objectError = @"There no object retrieved from Parse";
                PropertiesClass *PC = [[PropertiesClass alloc]initWithPropert1:objectError Propert2:nil Propert3:nil Propert4:nil];
                [myNSMutableArray addObject:PC];
            }

            for (int i = 0; i < objects.count; i++) {

                object = [objects objectAtIndex:i];

                NSString *Propert1 = [object objectForKey:@"Propert1"];
                NSNumber *Propert2 = [object objectForKey:@"Propert2"];
                NSNumber *Propert3 = [object objectForKey:@"Propert3"];
                NSString *Propert4 = [object objectForKey:@"Propert4"];

              PropertiesClass *PC = [[PropertiesClass alloc]initWithPropert1:Propert1 Propert2:Propert2 Propert3:Propert3 Propert4:Propert4];
             [myNSMutableArray addObject:PC];

            };


        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }


    }];




}
- (void)viewDidLoad
{   
    [super viewDidLoad];
    self.myNSMutableArray = [NSMutableArray array];
    [self retrievingDataFromParse];
    [MyTableView reloadData];

}

- (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 [myNSMutableArray count];
}

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


    PropertiesClass *PC= [myNSMutableArray objectAtIndex:indexPath.row];
    cell.textLabel.text=PC.Propert1;
    return cell;
}

4 个答案:

答案 0 :(得分:0)

你的代码非常神秘。这里几点建议。

首先,使用 camelCaseNotation (驼峰式表示法)重命名变量和方法。例如,MyMutableArray应为myMutableArrayRetrievingDataFromParse应为retrievingDataFromParse(依此类推)。开始大写字母用于课程。

其次,这段代码意味着什么(我对你的代码发表评论)?

for (int i = 0; i < objects.count; i++) {
    // where do you have defined object?
    object = [objects objectAtIndex:i];

    NSString *x = [object objectForKey:@"x"];
    NSNumber *y = [object objectForKey:@"y"];
    NSNumber *z = [object objectForKey:@"z"];
    NSString *t = [object objectForKey:@"t"];

    // is Mekan a subclass of PropertiyClass or what else?
    PropertiyClass *Properties = [[Mekan alloc]initWithx:x y:y z:z t:t]  
    // what's MekanKalibi? Maybe you need to add Properties
    [MyMutableArray addObject:MekanKalibi];
}

修改

如果您不使用iOS6 - (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier,则应alloc-init个单元格。

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if(!cell) {
    // alloc-init a new cell here...
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    // or if you don't use ARC
    // cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

PropertyClass *PC = [myMutableArray objectAtIndex:indexPath.row];
cell.textLabel.text = PC.x;
return cell;

修改2

我不知道解析如何工作,但我想它管理异步请求。因此,在for循环结束时,只需在表中调用重新加载数据。

答案 1 :(得分:0)

查看你的代码,我发现你永远不会创建一个UITableViewCell,你应该改变它:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    PropertyClass *PC = [myMutableArray objectAtIndex:indexPath.row];
    cell.textLabel.text = PC.x;
    return cell;
}

用这个:

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (nil == cell){
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    PropertyClass *PC = [myMutableArray objectAtIndex:indexPath.row];
    cell.textLabel.text = PC.x;
    return cell;
}

方法dequeueReusableCellWithIdentifier:forIndexPath:仅在表视图中有未使用但已分配的单元格时才返回UITableViewCell。否则它返回nil。

另外,当您更新包含所有数据的可变数组时,应调用[yourTableView reloadData]以强制表视图重新加载其内容。

答案 2 :(得分:0)

解析状态: InBackground方法是异步的,因此在此之后的任何代码都将立即运行。任何依赖于查询结果的代码都应该在上面的完成块中移动。

我遇到了同样的问题。当你重新加载表时,你需要移动它,使它在块内。为我工作。

我不能100%确定异步部分如何影响它。我知道我的viewDidload的开始和结束发生了这个块,因此问题。

人们应该这样做,因为这解决了这个问题。

干杯。

答案 3 :(得分:0)

您需要做的就是在块中重新加载tableView ...这将显示数据。

for(int i = 0; i&lt; objects.count; i ++){

            object = [objects objectAtIndex:i];

            NSString *Propert1 = [object objectForKey:@"Propert1"];
            NSNumber *Propert2 = [object objectForKey:@"Propert2"];
            NSNumber *Propert3 = [object objectForKey:@"Propert3"];
            NSString *Propert4 = [object objectForKey:@"Propert4"];

          PropertiesClass *PC = [[PropertiesClass alloc]initWithPropert1:Propert1 Propert2:Propert2 Propert3:Propert3 Propert4:Propert4];
         [myNSMutableArray addObject:PC];

        };


    } else {
        // Log details of the failure
        NSLog(@"Error: %@ %@", error, [error userInfo]);
    }

**[MyTableView reloadData];**

}];