禁用单个UITableViewCell的选择

时间:2010-08-30 18:54:44

标签: ios iphone cocoa-touch uitableview

如何禁用在UITableView中仅选择单个单元格?我有几个,我只希望最后一个被禁用。

9 个答案:

答案 0 :(得分:52)

要停止选择某些单元格,请使用:

cell.userInteractionEnabled = NO;

除了阻止选择之外,这还会阻止tableView:didSelectRowAtIndexPath:为设置它的单元格调用。它还会使画外音像暗灰色按钮一样(可能是您想要的也可能不是)。

请注意,如果单元格中有交互元素(即开关/按钮),则需要使用cell.selectionStyle = UITableViewCellSelectionStyleNone;,然后确保忽略tableView:didSelectRowAtIndexPath:中单元格上的点按。

答案 1 :(得分:51)

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

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

}

答案 2 :(得分:18)

将此内容放入自定义表VC:

// cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) {
        return nil;
    }
    return indexPath;
}

// disabled cells will still have userinteraction enabled for their subviews
- (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell
{
    tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;
    // if you dont want the blue selection on tap, comment out the following line
    tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone;
}

然后启用/禁用someTableViewCell的选择,请执行以下操作:

[self setEnabled:state forTableViewCell:someTableViewCell];

你已经完成并可以发货。

答案 3 :(得分:10)

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self numberOfRowsInSection] == [indexPath row]) {
        return nil;
    } else {
        return indexPath;
    }
}

不会选择表格的最后一行

答案 4 :(得分:2)

正如我提到的in another thread所有上述方法都没有准确地解决问题。禁用单元格的正确方法是通过方法

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

并且在该方法中必须使用

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

禁用单元格选择但仍然允许用户与单元格的子视图交互,例如UISwitch。

答案 5 :(得分:1)

我发现的最干净的解决方案只使用了委托方法willDisplayCell。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView
    {                        //simply change this around to suit your needs
        cell.userInteractionEnabled = NO;
        cell.textLabel.enabled = NO;
        cell.detailTextLabel.enabled = NO;
    }
}

您不必在委托方法didSelectRowAtIndexPath中采取任何进一步操作,以确保忽略此单元格的选择。此单元格上的所有触摸都将被忽略,单元格中的文本也将显示为灰色。

答案 6 :(得分:0)

iOS 6。

您可以使用以下委托方法并返回NO,以防您不选择它; YES以防您想要选择它。

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return indexPath.section == 0;
}

答案 7 :(得分:0)

在swift中试试这个:

self.tableView.deselectRowAtIndexPath(indexPath, animated: true)

答案 8 :(得分:0)

如果有人想知道如何在swift中实现这一点,那么这是我的代码。我正在使用Xcode 7并使用iPad Retina(iOS 9)进行测试。

cell.selectionStyle = UITableViewCellSelectionStyle .None
cell.userInteractionEnabled = false

尝试根据需要放置这两行代码。在我的情况下,我在这种方法中使用它来显示单元格。

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

请记住,这两行代码会阻止您对单元格的任何选择或交互,但如果需要,您只能单独使用第一行。那是......

cell.selectionStyle = UITableViewCellSelectionStyle .None

只有这一行才会阻止您对单元格的选择。

然而,第二行将使单元格为“只读”。那是......

cell.userInteractionEnabled = false

由于

希望这有帮助。