您所要做的就是使用以下任一方法在UITableViewCell
实例上设置选择样式:
Objective-C 的:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
要么
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
斯威夫特 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 和 4.x:
cell.selectionStyle = .none
此外,请确保您未在表视图委托中实现-tableView:didSelectRowAtIndexPath:
或明确排除您希望在没有操作的情况下执行它的单元格。
对我来说,以下工作正常:
tableView.allowsSelection = NO;
这意味着didSelectRowAt#
根本不起作用。也就是说,触摸桌子的一排,就这样,绝对不会做任何事情。 (因此,显然,永远不会有选定的动画。)
(注意,如果在单元格上,你有UIButton
或任何其他控件,当然这些控件仍然可以工作。你碰巧在表格单元格上有任何控件,与 UITableView 允许你 “选择一行” 的能力完全无关 “使用didSelectRowAt#
。)
因为我最近阅读了这篇文章,它帮助了我,我想发布另一个答案来巩固所有的答案(后代)。
因此,根据您所需的逻辑和 / 或结果,实际上有 5 种不同的答案:
1. 要禁用蓝色突出显示而不更改单元格的任何其他交互:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
当我在 UITutViewCell 中托管 UIButton 或其他控件时,我使用它,我希望用户能够与控件交互,但不能与单元本身交互。
注意 :正如 Tony Million 上面提到的,这不会阻止tableView:didSelectRowAtIndexPath:
. 我通过简单的 “if” 语句解决这个问题,通常测试该部分并避免对特定部分采取措施。
我想要测试这样一个单元格的另一种方法是:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// A case was selected, so push into the CaseDetailViewController
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
// Handle tap code here
}
}
2. 要对整个表格执行此操作,您可以将上述解决方案应用于表格中的每个单元格,但您也可以这样做:
[tableView setAllowsSelection:NO];
在我的测试中,这仍然允许UITableViewCell
内的控件是交互式的。
3. 要使单元格为 “只读”,您可以简单地执行此操作:
[cell setUserInteractionEnabled:NO];
4. 使整个表格 “只读”
[tableView setUserInteractionEnabled:NO];
5. 要在运行中确定是否突出显示一个单元格(根据此答案隐式包含选择),您可以实现以下UITableViewDelegate
协议方法:
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath