iPhone - NSMutableArray - UITableViewCell

时间:2011-11-23 15:51:23

标签: iphone nsmutablearray uitableview

Hello Folks

我有一个表视图,我从JSON输出加载。我已经实现了检查和取消选中UITableView单元格的功能。

问题1 - 当我滚动到视图的底部时,顶部的所有选定单元格都将被取消选中。我不知道为什么会发生这种情况,如果有人可以指导我:)

Problem2 - 我想抓取tableview中的所有选定单元格,并将它们放入NSMutableArray中。我知道有很多方法可以做到这一点,但你们可以告诉我一个更有效的方法。我花了将近2天的时间来搞清楚这一点,但仍然没有运气!

谢谢和最诚挚的问候

1 个答案:

答案 0 :(得分:2)

这是好事,因为你可能尚未完全掌握UITableView的工作原理。

它会重复使用单元格,这就是您在dequeTableCellWithIdentifier:上调用UITableView方法的原因。这意味着它将重用其中一个不再存在的单元格。

请勿为UITableViewCell中的每个项目添加UITableViewDataSource,这可能/将占用大量内存,而UITabelView会感觉非常慢。

只需确保数据源包含对象所需的所有数据,而不是UITableViewCell。含义标题,选定状态,......

您需要做的是在UITableViewDataSource项目中设置单元格的选定状态,并在UITableViewDataSource而不是UITableViewCell中查找所选的状态。

因此,在您从JSON检索的对象中添加一个选择的属性,该属性采用BOOL。

然后在UITableViewDataSoutrce方法cellForRowAtIndexPath中执行以下操作:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"SomeCellIdentiefier";

    UITableViewCell *cell = (SongTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (!cell) {
        //Load new cell
    }

    YouJSONObject *item = [self.array objectAtIndex:indexPath.row];

    if (item.selecte) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

}

然后,您的UITableViewDelegate方法didSelectRowAtIndexPath执行以下操作:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
YouJSONObject *item = [self.array objectAtIndex:indexPath.row]; 

    item.selected = !item.selected;
    if (item.selecte) {
       cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
       cell.accessoryType = UITableViewCellAccessoryNone;
    }
}