0

在您的回答取得了所有进展之后,我的问题发生了变化。所以我正在用更清晰的方式改变我的问题。我有一个 UITableView,它显示了我从 Parse.com 检索到的数据。所以我制作了一个 NSMutableArray 用于在检索对象时将对象添加到该数组中。但我的问题是即使我将对象添加到 NSMutableArray,我的表除了 UITableView 的默认屏幕外什么也不显示。我的问题是 UITableView 是在我的 NSMutableArray 得到它的对象之前形成的。这是我的代码:

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

在 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

4 回答 4

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

我不知道 parse 是如何工作的,但我想它管理异步请求。因此,在 for 循环结束时,只需调用表中的 reload data 即可。

于 2013-05-17T13:23:34.497 回答
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。否则返回零。

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

于 2013-05-17T13:55:47.510 回答
0

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

我有同样的问题。当您重新加载表格时,您需要将其移动到块内。为我工作。

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

人们可能应该这样做,因为这可以解决问题。

干杯。

于 2013-09-17T22:42:15.903 回答
0

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

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]);
    }

**[MyTableView reloadData];**

}];
于 2015-04-12T07:04:48.297 回答