UITableView在滚动时出现问题

时间:2014-08-08 06:46:36

标签: objective-c uitableview parse-platform

我遇到了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];
            }
        }];
    }
}

1 个答案:

答案 0 :(得分:1)

您需要以这样一种方式编写您的tableView:cellForRowAtIndexPath:,使其与调用的顺序无关。

只要UITableView需要获取单元格,就会调用该方法(有时这并不意味着它会被显示)。它将被多次调用,你不能依赖于特定的顺序(原因很明显:你无法预测用户将如何滚动)。

现在,您的问题是您的实施使用myTitle来分配标题。但是该值在tableView:cellForRowAtIndexPath:内计算 。您需要更改代码,以便始终可以访问索引路径所需的值,无论是以何种顺序或调用该方法的频率。

例如,在someMethod中,您可以将[object objectForKey:@"title"]中的值存储在NSMutableArrayNSMutableDictionary中(以@(i)为关键字)。然后,您可以在tableView:cellForRowAtIndexPath:中查询每个索引路径的标题。