【问题标题】:Allow only one UITableViewCell to be Checked in a section只允许在一个部分中检查一个 UITableViewCell
【发布时间】:2013-09-04 23:56:23
【问题描述】:

我试图在一个部分中一次只检查一个 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;
                }
            }
        }

    }
}

如您所见,我有三个部分,第一个部分用户可以选择任意数量的单元格,但在第二个和第三个部分中,它仅限于一个。

问题:每当我选择一个单元格,然后选择另一个单元格时,它就可以工作。如果我选择第一个单元格,它们现在都会被选中。

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

【问题讨论】:

    标签: ios uitableview uiaccessoryview


    【解决方案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];
    }
    

    【讨论】:

    • 谢谢,我会试一试...我需要重新加载数据吗?
    • @user2242965,是的,你必须重新加载数据才能看到变化(或者如果你想更有效率,你可以使用 reloadRowsAtIndexPaths,但这需要更多代码)。
    • 我正在尝试稍微修改它以使其如此,如果在第 3 节(self.selectedPathSpecial)中选择了一个单元格 - 所有其他复选标记都会消失......很好,这很有效。但是,当我尝试通过执行self.selectedPathSpecial = nil; 使 self.selectedPathSpecial 消失(如果 UITableView 中的任何其他单元格被选中)时,复选标记不会从单元格中消失......有什么想法吗?
    • @user2242965,您是否在该语句之后重新加载了数据?除此之外,如果没有看到您的代码,我无法说出可能出了什么问题。
    • @user2242965,你没有任何逻辑来做你想做的事——你将 selectedPathSpecial 设置为 nil 的唯一条件是当你点击那个单元格并且它已经被选中时。您必须将该行 (self.selectedPathSpecial = nil) 添加到您设置其他属性之一的所有其他情况(您将属性设置为 indexPath 或将 indexPAth 添加到数组中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2017-02-26
    相关资源
    最近更新 更多