如何使UITableView上的单元格不可选择?


Answers:


77

要删除基于行索引选择任何表格单元格或特定表格单元格的能力,请使用 willSelectRowAt

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {


        return nil
    }

要简单地删除选择元素的UI效果,请将UITableViewCell选择样式设置为UITableViewCellSelectionStyleNone

斯威夫特5:

selectionStyle = .none

81
这并不是使单元格不可选择,只是意味着选定单元格时其外观不会改变。tableView:didSelectRowAtIndexPath:轻触单元格时仍会被调用。为了真正防止选择,您需要在您的表上实现tableView:willSelectRowAtIndexPath:,UITableViewDelegate对于不可选择的行返回nil。
2013年

1
斯威夫特3 -cell.selectionStyle = UITableViewCellSelectionStyle.none
约翰·

4
或者简单地:cell.selectionStyle = .none
spencer.sm '18

64

要使每个单元完全无法选择一个单元,需要做两件事:

1-正如其他人所说:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

2-如下实现此委托方法:

// Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    if(cell.selectionStyle == UITableViewCellSelectionStyleNone){
        return nil;
    }
    return indexPath;
}


13

你可以做

cell.selectionStyle = UITableViewCellSelectionStyleNone;

1
缺少一个点。这是固定版本:cell.selectionStyle = UITableViewCellSelectionStyle.None
Oleg Popov

6

对于Swift 3,您可以使用

 cell.isUserInteractionEnabled = false

刚把代码放到表视图的cellForRowAt indexPath方法中,它很简单

当您想在表视图上禁用用户交互时,此方法很有用,否则您可以使用Ben先生的方法共享(以下)

也可以在Swift 4中使用。
leanne

对我来说很好。应该是正确的答案。另一种方法是,在tableView:didSelectRowAtIndexPath委托方法中,检测单元格索引,什么也不做然后返回。
永祥阮

关于此答案,我最喜欢的部分是您可以在单元格内声明它。如果您有一个单元格(例如一个空状态单元格)不想响应抽头,那么这是一个不错的方法。
麦克斯韦


5

我从禁用TableViewCell的角度回答。您可以使用情节提要。

XCode Version 8.2.1 (8C1002)

在情节提要板上选择TableVewCell,随后将在右侧面板-实用程序中看到以下内容。

实用工具侧栏

进行选择:无

就这样!


4

问题是如何使某些单元格可选而其他单元格则不是。这是我的解决方案,(在尝试了许多其他建议之后):

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    if (indexPath.row == 1 || indexPath.row == 2) {
        return indexPath
    }
    return nil        
}


2

在Swift 3中更新:

cell.selectionStyle = UITableViewCellSelectionStyle.none

1

对于Swift 3:

cell.selectionStyle = .none

如上面建议的那样,“这不会使单元格变为不可选择状态,这仅意味着单元格被选中时的外观不会改变。tableView:didSelectRowAtIndexPath:在单元格被点击时仍会被调用。实际上要防止选择需要在UITableViewDelegate上实现tableView:willSelectRowAtIndexPath:并为不可选择的行返回
nil。–

2
如原始问题所示,@ Siyavash,此人只想隐藏“蓝色选定的指示器”。这与希望使其完全不可选择不同。简单地说,提出问题的人只是试图隐藏选择的视觉指示。
David Villegas

1

实现此方法UITableViewDelegate

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return NO;
}


0

迅捷5

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell;
    cell.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.