只允许在一个部分中选中一个UITableViewCell

时间:2013-09-04 23:56:24

标签: ios uitableview uiaccessoryview

我试图在一个部分中一次只能检查一个UITableViewCell。我要做的是取消选中已检查的UITableViewCell(如果有)并检查当前选定的单元格。所以基本上,如果选择了一个CellA,并且我选择了CellB,我希望CellA取消选择并选择CellB。

以下是我为实现这一目标所做的工作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(![self.selectedIndexPaths containsObject:indexPath]) {
        [self.selectedIndexPaths addObject:indexPath];
    }
    else {
        [self.selectedIndexPaths removeObject:indexPath];
    }

    if (indexPath.section == 0) {
        [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO; 
    }
    else if (indexPath.section == 1) {
        if (![self.selectedIndexPaths containsObject:indexPath]) {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
        }
        else {
            for (NSIndexPath *indexPath2 in self.selectedIndexPaths) {
                if (indexPath2.section == 1) {
                    [tableView cellForRowAtIndexPath:indexPath2].accessoryView.hidden = YES;
                    [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
                }
            }
        }
    }
    else if (indexPath.section == 2) {
        if (![self.selectedIndexPaths containsObject:indexPath]) {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
        }
        else {
            for (NSIndexPath *indexPath2 in self.selectedIndexPaths) {
                if (indexPath2.section == 2) {
                    [tableView cellForRowAtIndexPath:indexPath2].accessoryView.hidden = YES;
                    [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
                }
            }
        }

    }

}

-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 0) {
        if ([tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden == YES) {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
        }
        else {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = YES;
        }
    }
    else if (indexPath.section == 1) {
        if (![self.selectedIndexPaths containsObject:indexPath] && [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden == YES) {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
        }
        else if (![self.selectedIndexPaths containsObject:indexPath] && [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden == NO){
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = YES;
        }
        else {
            for (NSIndexPath *indexPath2 in self.selectedIndexPaths) {
                if (indexPath2.section == 1 && [tableView cellForRowAtIndexPath:indexPath2].accessoryView.hidden == YES) {
                    [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
                }
            }
        }
    }
    else if (indexPath.section == 2) {
        if (![self.selectedIndexPaths containsObject:indexPath] && [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden == YES) {
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
        }
        else if (![self.selectedIndexPaths containsObject:indexPath] && [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden == NO){
            [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = YES;
        }
        else {
            for (NSIndexPath *indexPath2 in self.selectedIndexPaths) {
                if (indexPath2.section == 2 && [tableView cellForRowAtIndexPath:indexPath2].accessoryView.hidden == YES) {
                    [tableView cellForRowAtIndexPath:indexPath].accessoryView.hidden = NO;
                }
            }
        }

    }
}

正如您所看到的,我有三个部分,第一部分用户可以选择他们想要的多个单元格,但在第二部分和第三部分中,它仅限于一部分。

问题:每当我选择一个单元格然后选择另一个单元格时,它就会起作用。如果我选择第一个单元格,现在都会检查它们。

我将不胜感激任何帮助或建议。谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码看起来比它需要的复杂得多。我会通过为第1和第2部分创建一个属性(类型为NSIndexPath),为第0部分创建一个数组属性来跟踪相应部分中选定的一个或多个单元格。使用indexPath设置属性的值,或者在单元格的情况下添加indexPath,在单击某个单元格时(如果已经选中了该单元格则将其删除)。然后检查cellForRowAtIndexPath中的那些属性或数组的状态。

@interface TableController ()
@property (strong,nonatomic) NSArray *theData;
@property (strong,nonatomic) NSIndexPath *selectedPathForSection1;
@property (strong,nonatomic) NSIndexPath *selectedPathForSection2;
@property (strong,nonatomic) NSMutableArray *selectedPaths;
@end

@implementation TableController 


- (void)viewDidLoad {
    [super viewDidLoad];
    self.selectedPaths = [NSMutableArray new];
    self.selectedPathForSection1 = nil;
    self.selectedPathForSection2 = nil;
}


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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = self.theData[indexPath.section][indexPath.row];
    if ([self.selectedPathForSection1 isEqual:indexPath] || [self.selectedPathForSection2 isEqual:indexPath] || [self.selectedPaths containsObject:indexPath]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    switch (indexPath.section) {
        case 0:
            if (! [self.selectedPaths containsObject:indexPath]) {
                [self.selectedPaths addObject:indexPath];
            }else{
                [self.selectedPaths removeObject:indexPath];
            }
            break;
        case 1:
            if (![self.selectedPathForSection1 isEqual:indexPath]) {
                self.selectedPathForSection1 = indexPath;
            }else{
                self.selectedPathForSection1 = nil;
            }
            break;
        case 2:
            if (![self.selectedPathForSection2 isEqual:indexPath]) {
                self.selectedPathForSection2 = indexPath;
            }else{
                self.selectedPathForSection2 = nil;
            }
            break;
    }
    [tableView reloadData];
}