UITableView将某些单元设置为“不可选”

时间:2009-05-01 17:45:41

标签: iphone cocoa-touch

如何将UITableView的单元格属性设置为不可选?当用户点击单元格时,我不希望看到蓝色选择框。

16 个答案:

答案 0 :(得分:193)

防止行选择

要完全阻止选择UITableViewCell,请使用UITableViewDelegate实施tableView:willSelectRowAtIndexPath:。如果您不希望选择该行,则可以从该方法返回nil

- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
    // Determine if row is selectable based on the NSIndexPath.

    if (rowIsSelectable) {
        return path;
    }
    return nil;
}

这可以防止选择行并调用tableView:didSelectRowAtIndexPath:。但请注意,会阻止该行突出显示。

防止行突出显示

如果您希望阻止该行在视觉上突出显示,您可以确保该单元格的selectionStyle设置为UITableViewCellSelectionStyleNone,或者您最好可以使用UITableViewDelegate工具tableView:shouldHighlightRowAtIndexPath:如下:

- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Determine if row is selectable based on the NSIndexPath.

    return rowIsSelectable;
}

答案 1 :(得分:151)

将表格单元格的selectionStyle属性设置为UITableViewCellSelectionStyleNone。这应该可以防止它突出显示,您还可以在tableView:didSelectRowAtIndexPath:

中检查该属性

答案 2 :(得分:16)

使用它:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

答案 3 :(得分:11)

仅适用于iOS 6+。

您可以实施该方法 您的代表中tableView:shouldHighlightRowAtIndexPath:。 在此处阅读更多内容:http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html

答案 4 :(得分:8)

也有这个问题,尝试过已经提到的一切。在选择表格单元时摆脱“蓝色闪光”的最后一招是添加这一行:

self.myTableView.allowsSelection = NO;

不确定是这一行还是一切都结合在一起,但作为总体结果,我不再获得蓝色选择甚至蓝色闪光。快乐!

答案 5 :(得分:7)

设置cell.userInteractionEnabled = NO;

答案 6 :(得分:5)

使用IB也是一种优雅的方式:

enter image description here

答案 7 :(得分:3)

Apple说你应该在didSelectRowAtIndexPath中做的第一件事是取消选择行

[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];

然后您可以将AccessoryType更改为复选标记,或者不将其更改为等等。因此,当您输入didSelectRowAtIndexPath时,您可以取消选择该行,如果不想选择该行,则只需不要检查该行。

Table View Programming Guide

答案 8 :(得分:3)

另一种方法是向UITableViewCell添加几个类别方法。我比Sebastians(也很好)的回答更喜欢这个,因为我正在建造我的桌子。我认为这可能对其他人有帮助。

- (void)setSelectable:(BOOL)enabled {
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
    [self setUserInteractionEnabled:enabled];
}

- (BOOL)isSelectable {
    BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
                     [self isUserInteractionEnabled];
    return ! disabled;
}

答案 9 :(得分:1)

如果您在Interface Builder中设计了单元格,则可以通过从启用用户交互'中删除复选框来执行此操作。对于tableViewCell

答案 10 :(得分:1)

斯威夫特4:
您可以使用UITableViewDelegate阻止选择和突出显示: shouldHighlightRowAt

本答案假定您创建了一个名为 CustomTableViewCell 的自定义单元格
您在该自定义单元格中创建了一个布尔值: isSelectable

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
    if cell.isSelectable == false {
        return false
    } else {
        return true
    }
}

这是Sebastian Celis的回答的Swift版本。

答案 11 :(得分:0)

还有另一种简单的方法可以避免选择显示为蓝色。

选择您不希望显示为蓝色的单元格。

然后选择属性检查器(侧面属性视图上标尺图标旁边的盾牌图标)。

然后将“选择”字段从“蓝色”更改为“无”。

注意,大概这仍然是选择,如果你想要的只是避免UI效果,它就不会显示为选中状态。

答案 12 :(得分:0)

要取消选择某行,您必须在UITableView委托的两个方法中进行一些更改。

在下面的方法中

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

分配完单元后,写下面的代码

if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;

如果用户试图以某种方式选择,上面的代码将阻止突出显示单元格。

在下面的委托方法中

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if(indexPath.row == someCellNumber) return;

    //for other cells write the code below...
}

如果你不写if(indexPath.row == someCellNumber) return;行仍然会被选中并且有可能发生应用程序崩溃

答案 13 :(得分:0)

使用tableView:willDisplayCell:forRowAtIndexPath:而不是tableView:didSelectRowAtIndexPath:来摆脱第一次触摸单元格时出现的闪光。

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

答案 14 :(得分:0)

斯威夫特4:

在细胞类中:

selectionStyle = .none

答案 15 :(得分:0)

雨燕5

cell.isUserInteractionEnabled = false