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


109

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


4
注意最近的Google:本办法做到这一点的iOS 6中的和更大的tableView:shouldHighlightRowAtIndexPath:作为由AYUSH下面提到
jemmons

Answers:


151

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


3
肯德尔是对的。请遵循塞巴斯蒂安·塞利斯(Sebastian Celis)的回答,以防止首先调用didSelectRowAtIndexPath。但是,还应设置selectionStyle以防止突出显示。
丹尼尔·迪克森

是的,我想塞巴斯蒂安·
塞里斯(

1
使用静态TableViews的故事板粉丝可以选择UITableViewCell,在“属性检查器”下可以找到“ 选择字段”并将其设置为“ 无”
Manuel BM

197

防止选择行

要完全防止选择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
谢谢!正是我所需要的。
Buchannon

10
我认为这应该是公认的答案。实际上,它可以解决问题而不是掩盖它。
Tovi7 2012年

4
请注意,在突出显示单元格之后将调用tableView:willSelectRowAtIndexPath:,这将产生闪烁。从苹果公司的描述中:直到用户触摸一行然后抬起手指,才调用此方法。该行直到那时才被选中,尽管它在着陆时突出显示。
丹尼尔(Daniel)

5
我同意@simpleBob。为了使用此解决方案,您还需要在不可选择的行上将cell.selectionStyle设置为UITableViewCellSelectionStyleNone。否则看起来很俗气。
凯尔·克莱格

那么最好的答案仍然是公认的答案。您可以选择不执行任何操作,didSelectRowAtIndexPath因为willSelectRowAtIndexPath总会被调用。
马修·基罗斯

16

用这个:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

5
didSelectRowAtIndexPath仍然只叫停止选择颜色的显示。
zekel 2010年

这与Daniel Dickison对这个问题的答案也完全相同。

Swift 2.2更新-cell.selectionStyle = UITableViewCellSelectionStyle.None
uplearnedu.com 2016年

11

仅适用于iOS 6+。

您可以tableView:shouldHighlightRowAtIndexPath:在委托中实现该方法 。在此处阅读更多信息:http : //developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html


3
应该有更多的赞成票。这是正确的答案,更改选择样式,使您看不到已选择单元格,禁用用户交互,因此无法轻按单元格或取消选择单元格,这些都是hack。
斯图尔特·坎贝尔

9

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

self.myTableView.allowsSelection = NO;

不确定是这条线还是所有东西组合在一起,但是作为总的结果,我没有更多的蓝色选择,甚至没有蓝色闪烁。快乐!


1
问题在于它使表格视图中的所有单元格都不可选。如果您希望某些单元格是可选的,而其他单元格是不可选择的,则不会这样做。塞巴斯蒂安的方法对我有用。
特里

是的,allowSelection = NO将禁用所有单元格的选择。
JOM

1
接口构建器中是否有与此属性等效的属性?
克里斯

8

cell.userInteractionEnabled = NO;


等等,那样做。有点。使“ FALSE”变小写并失去那个疯狂的分号。那将为您迅速解决。'FALSE'是邪恶和错误,现在'NO'是邪恶和错误。直到下个星期,“假”是邪恶和错误时,才可以这样做。
HalR


3

苹果公司说,在didSelectRowAtIndexPath中应该做的第一件事就是取消选择行

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

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

表格视图编程指南


1
在这种情况下,当用户触摸该单元格时,它将在短时间内突出显示,然后不突出显示-但是据我所知,关键是要完全阻止它突出显示。
库巴·苏德

3

另一种方法是在中添加几个类别方法UITableViewCell。我比塞巴斯蒂安(也很好)的回答更喜欢这个,因为我建立桌子的方式。我认为这可能对其他人有帮助。

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

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

3

斯威夫特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的objc答案的Swift版本。


1

如果您已经在Interface Builder中设计了单元格,则可以通过取消选中“ 启用用户交互 ” 复选框来实现tableViewCell


0

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

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

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

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

请注意,大概这仍在选择中,如果您要避免UI效果,它将不会显示为选中状态。


0

使用tableView:willDisplayCell:forRowAtIndexPath:代替tableView:didSelectRowAtIndexPath:摆脱第一次触摸单元格时出现的闪烁。

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

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;则仍然会选择行,并且有可能导致应用崩溃


0

斯威夫特4:

在单元格类中:

selectionStyle = .none

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.