使用部分检查/取消选中tableviewcell

时间:2012-05-28 00:39:44

标签: objective-c ios xcode uitableview didselectrowatindexpath

以前,我在tableview中显示了一个大型数据集(~530条记录)。数据保存在一个字典数组中,其中包含两个键ID和名称。以前,我点了一个单元格,它添加了一个复选标记,然后它将单元格行号发送到'selectedArray'。由于我已按字母顺序排序它们(仍在一个部分中),存储在selectedArray中的indexPath.row对应于字典的数组索引,因此我可以从记录中提取数据(ID)。

我决定按字母顺序将其拆分为标题(这是一个绝对的痛苦,我不明白为什么将标题插入记录列表这是一个如此复杂的过程)。但是现在,因为我只使用了indexPath.row,当我勾选第一个时,它会勾选每个部分的第一个记录,并且只返回数字0,所以我只得到整个数据集中的第一个记录。有没有一种简单的方法来纠正这个?非常感谢任何帮助。

的cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"inviteCell"];

//    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }


//    NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row];


    //---get the letter in the current section---
    NSString *alphabet = [nameIndex objectAtIndex:[indexPath section]];
    //---get all states beginning with the letter---
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF.name beginswith[c] %@", alphabet];
    NSArray *states = [sortedFriendsArray filteredArrayUsingPredicate:predicate];
    if ([states count]>0) {
//---extract the relevant state from the states object---

        NSDictionary *friend = [states objectAtIndex:indexPath.row];
        long long fbid = [[friend objectForKey:@"id"]longLongValue];
        NSString *name = [friend objectForKey:@"name"];

        NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%qi/picture?type=square",fbid];
        NSURL *url = [NSURL URLWithString:urlString];

        UILabel *eventNameLabel = (UILabel *) [cell viewWithTag:1];
        eventNameLabel.text = name;

        UIImageView *eventLogo = (UIImageView*) [cell viewWithTag:2];
        eventLogo.image = [UIImage imageNamed:@"112-group.png"];
        //    eventLogo.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];;

    }

        return cell;

}

CURRENT didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSNumber *indexNumber = [NSNumber numberWithInt:indexPath.row];
    NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row];
    long long fbid = [[friend objectForKey:@"id"]longLongValue];
    NSNumber *fbidNum = [NSNumber numberWithLongLong:fbid];

    if ([checkedCells objectForKey:indexNumber] != nil) {
        [checkedCells removeObjectForKey:indexNumber];
        cell.accessoryType = UITableViewCellAccessoryNone;

    }
    else
    {
        [checkedCells setObject:fbidNum forKey:indexNumber];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }


    NSLog(@"Cell Pressed: %@",indexNumber);
    NSLog(@"FBID: %lld",fbid);
    NSLog(@"Array: %@",checkedCells);
}

1 个答案:

答案 0 :(得分:0)

看起来您只是按行保存已选中的单元格,而不是按节和行保存。至少,您不需要测试该部分以及该代码块中的行吗?

if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType = UITableViewCellAccessoryNone;
}

现在已经很晚了,我没有使用我的Mac来尝试这个代码,所以也许我错过了一些明显的东西。我不确定你说的只是返回零...是indexPath.row?

编辑:

为了说明数据数组中的部分,我建议将数据存储为数组字典,每个字母键入一个字典条目,内部数组包含以该字母开头的所有条目。检索数据有点复杂,但它正确地说明了这一部分。

我认为您可以创建某种偏移量来计算每个部分中的条目数,然后使用它来索引到一个平面数组,但在我看来,这将更难维护。我认为数组字典是要走的路。