在我用你的答案取得所有进展后,我的问题发生了变化。所以我以更清晰的方式改变我的问题。我有一个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;
}
答案 0 :(得分:0)
你的代码非常神秘。这里几点建议。
首先,使用 camelCaseNotation (驼峰式表示法)重命名变量和方法。例如,MyMutableArray
应为myMutableArray
。 RetrievingDataFromParse
应为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];**
}];