我遇到了UITableView的问题,该问题从parse.com上的数据表中获取数据。问题是每次我向下滚动,完全隐藏第一个单元格然后向上滚动,第一个单元格titleL
上的文本就是另一个单元格的文本。请查看我的代码,让我知道我做错了什么。在将来使用UITableViews时,我的代码还有更好的做法吗?
代码
- (void)viewDidLoad {
[super viewDidLoad];
[self someMethod];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifer = [NSString stringWithFormat:@"CellIdentifier%i",num];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer];
}
UILabel *titleL = [[UILabel alloc] initWithFrame:CGRectMake(10,10,300,20)];
titleL.text = myTitle;
[cell addSubview:titleL];
return cell;
}
-(void) someMethod {
for (int i = 0; i < arr.count; i++) {
PFQuery *query = [PFQuery queryWithClassName:@"SomeClass"];
[query whereKey:@"objectId" equalTo:[arr objectAtIndex:i]];
[query getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (!object) {
} else {
myTitle = [object objectForKey:@"title"];
num = i;
[feed beginUpdates];
[feed reloadRowsAtIndexPaths:myArr withRowAnimation:UITableViewRowAnimationAutomatic];
[feed endUpdates];
}
}];
}
}
答案 0 :(得分:1)
您需要以这样一种方式编写您的tableView:cellForRowAtIndexPath:
,使其与调用的顺序无关。
只要UITableView
需要获取单元格,就会调用该方法(有时这并不意味着它会被显示)。它将被多次调用,你不能依赖于特定的顺序(原因很明显:你无法预测用户将如何滚动)。
现在,您的问题是您的实施使用myTitle
来分配标题。但是该值在tableView:cellForRowAtIndexPath:
内计算 。您需要更改代码,以便始终可以访问索引路径所需的值,无论是以何种顺序或调用该方法的频率。
例如,在someMethod
中,您可以将[object objectForKey:@"title"]
中的值存储在NSMutableArray
或NSMutableDictionary
中(以@(i)
为关键字)。然后,您可以在tableView:cellForRowAtIndexPath:
中查询每个索引路径的标题。