UITableView选择 - 多项选择

时间:2014-04-20 10:57:41

标签: ios objective-c uitableview

我有一个奇怪的uitableview选择问题。尝试使用预选的几个单元格进行多项选择。多项选择设置为true。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.font = [UIFont systemFontOfSize: 15.0f];
    cell.textLabel.text = [data objectAtIndex:indexPath.row];

    //    if([_selectedInts containsObject:[NSNumber numberWithInt:(int)indexPath.row]]){
    //
    //        [cell setSelected:YES animated:NO];
    //
    //    } else {
    //
    //        [cell setSelected:NO animated:NO];
    //
    //    }


    return cell;
}



-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{

    cell.selectionStyle = UITableViewCellSelectionStyleGray;
    [cell setUserInteractionEnabled:YES];


    if([_selectedInts containsObject:[NSNumber numberWithInt:(int)indexPath.row]]){

        [cell setSelected:YES animated:YES];
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {

        [cell setSelected:NO animated:YES];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }

}

当tableview加载时,由于标记需要选择的索引的整数列表,选择了一堆单元格。

这些细胞停止反应并且不会发出选择,并且在敲击后会重新选择方法。

有什么问题?

2 个答案:

答案 0 :(得分:1)

我不确定为什么把这些代码放在willDisplayCell中会导致这种情况发生,但是当我尝试你的代码时我发现了同样的事情。将代码放在cellForRowAtIndexPath中:如果我使用了selectRowAtIndexPath:animated:scrollPosition:而不是setSelected :(如果我使用setSelected:,则单元格没有显示选择颜色,但它们是响应的)。因此,此代码用于显示复选标记和选择颜色,并在选择或取消选择其他单元格时正确更改该状态。另请注意,我将单元格出列,因为这比您创建单元格的方式更节省内存,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    cell.textLabel.font = [UIFont systemFontOfSize: 15.0f];
    cell.textLabel.text = [data objectAtIndex:indexPath.row];

    if([_selectedInts containsObject:@(indexPath.row)]){
        [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }
    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    [self.selectedInts addObject:@(indexPath.row)];
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}


-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.selectedInts removeObject:@(indexPath.row)];
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

答案 1 :(得分:0)

在cellForRowAtIndexPath方法中,每当单元格可见时,您真的需要创建新单元吗?

让我们试试,这是Apple推荐的最佳做法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"a";
return cell;
}

希望这有助于你