Answers:
对我来说,以下工作正常:
tableView.allowsSelection = false
这意味着didSelectRowAt#
根本行不通。就是说,如此触摸桌子的一行绝对不会做任何事情。(因此,显然,绝不会有选定的动画。)
(请注意,如果在单元格上有UIButton
或其他任何控件,这些控件当然仍然可以使用。您碰巧在表格单元格上拥有的任何控件与UITableView允许您“选择一行”的功能完全无关。使用didSelectRowAt#
。)
要注意的另一点是:UITableView
在处于编辑模式时,此功能不起作用。要在编辑模式下限制单元格的选择,请使用以下代码:
tableView.allowsSelectionDuringEditing = false
selectionStyle
在单元格上设置属性:cell.selectionStyle = UITableViewCellSelectionStyle.None
在Swift或cell.selectionStyle = UITableViewCellSelectionStyleNone
Objective-C中。
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
要调用它,cell.selectionStyle = .None
则是需要的。如果您不希望或不希望调用该委托函数(即,在tableViewCell中具有文本字段),则设置tableView.allowsSelection = false
就可以了。
您要做的就是UITableViewCell
使用以下任一方法在实例上设置选择样式:
目标C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
要么
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
斯威夫特2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3和4.x:
cell.selectionStyle = .none
此外,请确保您没有-tableView:didSelectRowAtIndexPath:
在表视图委托中实施,或者明确排除了您希望执行任何操作的单元格。
因为我最近阅读了这篇文章并且对我有所帮助,所以我想发布另一个答案以合并所有答案(以供后代使用)。
因此,实际上有5个不同的答案,具体取决于您所需的逻辑和/或结果:
1.要禁用蓝色突出显示而不更改单元格的任何其他交互:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
当我有一个UIButton-或其他一些控件-托管在UITableViewCell中并且希望用户能够与控件(而非单元格本身)进行交互时,可以使用此控件。
注意:如上文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
tableView:shouldHighlightRowAtIndexPath:
,这通常(并非总是)是我的首选方法。
根据我自己的实现经验,总结一下我认为是正确的答案:
如果要仅禁用某些单元格的选择,请使用:
cell.userInteractionEnabled = NO;
除了阻止选择之外,这还会停止为设置了它的单元格调用tableView:didSelectRowAtIndexPath:。(感谢托尼·百万,谢谢!)
如果您的单元格中有需要单击的按钮,则需要改为:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
并且您还需要忽略对中单元格的任何点击- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
。
如果要禁用整个表的选择,请使用:
tableView.allowsSelection = NO;
(感谢Paulo De Barros,谢谢!)
从iOS 6.0开始,UITableViewDelegate
具有tableView:shouldHighlightRowAtIndexPath:
。(有关详细信息,请参阅iOS 文档。)
此方法使您可以将特定的行标记为不可突出显示(并且隐式地为不可选择),而不必更改单元格的选择样式,使用userInteractionEnabled = NO
或此处介绍的任何其他技术来弄乱单元格的事件处理。
您还可以通过NoSelection
从selection
检查器窗格的(UITableView属性的)选项中进行选择,来禁用从界面生成器本身进行的行选择,如下图所示。
SWIFT 3的固定解决方案
cell.selectionStyle = .none
这是我在cellForRowAtIndexPath
编写此代码时使用的:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
在UITableViewDelegate
协议中,您可以使用方法willSelectRowAtIndexPath
,return nil
如果您不想选择该行。
以相同的方式,您可以使用willDeselectRowAtIndexPath
方法,return nil
如果您不希望取消选择该行。
1-您要做的就是使用以下任一方法在UITableViewCell
实例上设置选择样式:
目标C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
要么
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
斯威夫特2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
斯威夫特3:
cell.selectionStyle = .none
2-请勿实施- tableView:didSelectRowAtIndexPath:
在表格视图中delegate
或明确排除要执行的操作而无需执行任何操作的单元格。
3-此外,您还可以从情节提要中进行操作。单击表视图单元格,然后在“表视图单元格”下的属性检查器中,将“选择”旁边的下拉列表更改为“无”。
4-您可以使用(iOS)Xcode 9,Swift 4.0中的以下代码禁用表格单元格突出显示
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
cell.selectionStyle = .none
return cell
}
摘录下方的代码段禁用了突出显示功能,但也禁用了对的调用didSelectRowAtIndexPath
。因此,如果您未实现,请didSelectRowAtIndexPath
使用以下方法。在创建表时应添加它。不过,这将适用于按钮和UITextField
单元格内部。
self.tableView.allowsSelection = NO;
摘录下方的代码段禁用突出显示功能,并且不会禁用对的调用didSelectRowAtIndexPath
。在以下位置将单元格的选择样式设置为“无”cellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
在摘要下方,禁用单元格上的所有内容。这将禁用互动buttons
,textfields
:
self.tableView.userInteractionEnabled = false;
以下是Swift
上述Objective-C
解决方案的等效项:
替换第一个解决方案
self.tableView.allowsSelection = false
替代第二种解决方案
cell?.selectionStyle = UITableViewCellSelectionStyle.None
替代第三种解决方案
self.tableView.userInteractionEnabled = false
尝试输入:
cell.selected = NO;
需要时,它将取消选择您的行。
在Swift3中...
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let r = indexPath.row
print("clicked .. \(r)")
tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}
我也一直在为此作斗争,控制我UITableViewCell
禁止使用userInteractionEnabled
财产。我有一个用于设置的3单元格静态表格,其中2个带有日期,1个带有开/关开关。在Storyboard / IB中玩过之后,我设法使底部的一个不可选择,但是当您点击它时,顶部之一的选择就消失了。这是我的设置UITableView的WIP图像:
如果您点击第三行,则什么也没有发生,选择将保留在第二行。该功能实际上是Apple日历应用程序的添加事件时间选择屏幕的副本。
该代码令人惊讶地兼容,一直到IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
这与将选择样式设置为none一起工作,因此单元格不会在触地事件时闪烁
您只需要将此代码放入cellForRowAtIndexPath
禁用单元格的选择属性:(同时轻击单元格)。
cell.selectionStyle = UITableViewCellSelectionStyle.None
虽然这是防止行在选择过程中显示突出显示的最佳和最简单的解决方案
cell.selectionStyle = UITableViewCellSelectionStyleNone;
我还想建议偶尔显示一下已选中该行然后将其关闭的方法有时会很有用。这会向用户发出警告,告知他们要选择的内容:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
UITableViewCellSelectionStyleNone
如果您不想/不能使用,您还可以将背景颜色设置为“透明”以达到与相同的效果UITableViewCellSelectionStyleNone
。
您将使用如下代码:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
当您向每个单元格添加额外的彩色视图时,这可能会降低性能。
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
编码愉快!
selection
,当然要highlighting
禁用它。许多投票赞成的答案解释了如何disable selection
以及不解决残疾问题highlighting
。要仅禁用突出显示,请使用cell.selectionStyle = .None
或转到storyboard / cell / Selection = None