提问人:davidmytton 提问时间:10/10/2008 最后编辑:Malikdavidmytton 更新时间:11/3/2022 访问量:537247
如何禁用 UITableView 选择?
How can I disable the UITableView selection?
答:
您所要做的就是使用以下任一方法在实例上设置选择样式:UITableViewCell
目标-C:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
或
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
斯威夫特 2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3 和 4.x:
cell.selectionStyle = .none
此外,请确保您要么不在表视图委托中实现,要么显式排除您希望不执行任何操作的单元格(如果确实实现了它)。-tableView:didSelectRowAtIndexPath:
评论
在协议中,您可以使用该方法,如果您不希望选择该行。UITableViewDelegate
willSelectRowAtIndexPath
return nil
以同样的方式,您可以使用该方法,如果您不希望取消选择该行。willDeselectRowAtIndexPath
return nil
评论
对我来说,以下工作正常:
tableView.allowsSelection = false
这意味着根本行不通。也就是说,触摸桌子的一排,就其本身而言,绝对无济于事。(因此,很明显,永远不会有选定的动画。didSelectRowAt#
(请注意,如果在单元格上,您有或任何其他控件,当然这些控件仍然有效。您碰巧在表单元格上拥有的任何控件都与 UITableView 允许您使用 . “选择行”的功能完全无关。UIButton
didSelectRowAt#
需要注意的另一点是:当处于编辑模式时,这不起作用。要在编辑模式下限制单元格选择,请使用以下代码:UITableView
tableView.allowsSelectionDuringEditing = false
评论
selectionStyle
cell.selectionStyle = UITableViewCellSelectionStyle.None
cell.selectionStyle = UITableViewCellSelectionStyleNone
tableView.allowSelection = false
tableViewDidSelectRowAtIndexPath
cell.selectionStyle = .None
tableView.allowsSelection = 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)
}
根据我自己在实现这一点方面的经验,总结一下我认为是正确的答案:
如果只想禁用某些单元格的选择,请使用:
cell.userInteractionEnabled = NO;
除了阻止选择外,这还会阻止为设置了 tableView:didSelectRowAtIndexPath: 的单元格调用。(感谢 Tony Million 的回答,谢谢!
如果单元格中有需要单击的按钮,则需要:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
并且您还需要忽略对 中的单元格的任何点击。- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
如果要禁用整个表的选择,请使用:
tableView.allowsSelection = NO;
(感谢 Paulo De Barros,谢谢!
评论
tableView.allowsSelection = NO;
不允许在单元格内点击按钮......从那以后有什么变化吗?我知道这篇文章很旧
self
因为我最近读了这篇文章,它对我有帮助,所以我想发布另一个答案来巩固所有答案(供后代使用)。
因此,根据您想要的逻辑和/或结果,实际上有 5 个不同的答案:
1.To 禁用蓝色突出显示,而不更改单元格的任何其他交互:
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
当我在 UITableViewCell 中托管 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.To 对整个表格执行此操作,可以将上述解决方案应用于表格中的每个单元格,但也可以这样做:
[tableView setAllowsSelection:NO];
在我的测试中,这仍然允许 UITableViewCell
内部的控件是交互式的。
3.To 将单元格设置为“只读”,您可以简单地执行以下操作:
[cell setUserInteractionEnabled:NO];
4.To 将整个表设置为“只读”
[tableView setUserInteractionEnabled:NO];
5.To 即时确定是否突出显示单元格(根据此答案隐式包括选择),可以实现以下协议方法:UITableViewDelegate
- (BOOL)tableView:(UITableView *)tableView
shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
评论
tableView:shouldHighlightRowAtIndexPath:
添加一个大声疾呼,这通常是(并非总是)我的首选方法。
我们可以编写如下代码
cell.selectionStyle = UITableViewCellSelectionStyleNone;
但是当我们在行上方有自定义单元格 xib 时,此时会发出警告
定制细胞 XIB
我们需要从界面构建器中设置选择样式 None
试试这个
cell.selectionStyle = UITableViewCellSelectionStyleNone;
和
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
您还可以使用InterfaceBuilder设置选择样式。
从 iOS 6.0 开始,具有 .(在 iOS 文档中阅读相关内容。UITableViewDelegate
tableView:shouldHighlightRowAtIndexPath:
使用此方法,您可以将特定行标记为不可突出显示(并且隐式地不可选择),而无需更改单元格的选择样式、使用 或此处记录的任何其他技术来处理单元格的事件。userInteractionEnabled = NO
评论
如果希望选择只闪烁,而不保持选中状态,可以调用,在
didSelectRowAtIndexPath
以下
[tableView deselectRowAtIndexPath:indexPath animated:YES];
因此,它将闪烁所选状态并恢复。
评论
更好的方法是:
cell.userInteractionEnabled = NO;
此方法不会调用 method。didSelectRowAtIndexPath:
我也一直在与此作斗争,对我禁止使用财产进行了控制。我有一个 3 个单元格的静态设置表,其中 2 个带有日期,1 个带有开/关开关。在 Storyboard/IB 中玩过之后,我设法使底部的一个不可选择,但是当您点击它时,顶部一行的选择就会消失。下面是我的设置 UITableView 的 WIP 图像:UITableViewCell
userInteractionEnabled
如果您点击第 3 行,则没有任何反应,选择将保留在第二行。该功能实际上是 Apple 日历应用程序的添加事件时间选择屏幕的副本。
代码出奇地兼容,一直到 IOS2 =/:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
return nil;
}
return indexPath;
}
这与将选择样式设置为无结合使用,因此单元格不会在触地事件时闪烁
禁用 UItableviewcell 的突出显示
cell.selectionStyle = UITableViewCellSelectionStyleNone;
并且不应允许用户与单元格进行交互。
cell.userInteractionEnabled = NO;
至少从 iOS 6 开始,您可以覆盖自定义单元格中的方法以防止蓝色突出显示。不会禁用或影响其他交互。必须覆盖所有三个。
- (void) setHighlighted:(BOOL)highlighted
{
}
- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
}
- (void) setSelected:(BOOL)selected animated:(BOOL)animated
{
}
您还可以通过从检查器窗格中的选项(UITableView 属性)中进行选择来禁用从界面构建器本身选择行,如下图所示NoSelection
selection
评论
您可以使用此
cell.selectionStyle = UITableViewCellSelectionStyleNone;
虽然这是防止行在选择过程中显示突出显示的最佳和最简单的解决方案
cell.selectionStyle = UITableViewCellSelectionStyleNone;
我还想建议,偶尔简要显示该行已被选中,然后将其关闭是有用的。这会提醒用户确认他们打算选择的内容:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}
最好的解决方案是将选择样式设为无
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
但是,这里我们考虑的是,没有用于选定状态的自定义图像。
您可以使用....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
您也可以将背景颜色设置为 Clear 以达到与 相同的效果,以防您不想/不能使用 。UITableViewCellSelectionStyleNone
UITableViewCellSelectionStyleNone
您将使用如下代码:
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];
这可能会降低您的性能,因为您为每个单元格添加了额外的彩色视图。
cell.selectionStyle = UITableViewCellSelectionStyleNone;
您可以使用:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
在 UITableView 的索引路径方法的行单元格中。
您也可以使用:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
在 TableView 中,didselectrowatindexpath 方法。
评论
cell.selectionStyle = UITableViewCellSelectionStyle.none
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];
快乐的编码!!
目标-C:
下面的代码片段禁用突出显示,但它也禁用对 .因此,如果您不实施,请使用以下方法。这应该在创建表时添加。不过,这将适用于按钮和单元格内部。
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
编辑:对于较新的Swift,它更改为:
cell.selectionStyle = .none
有关详细信息,请参阅以下内容: https://developer.apple.com/documentation/uikit/uitableviewcell/selectionstyle
如果有人需要 Swift 的答案:
cell.selectionStyle = .None
评论
您也可以从情节提要中执行此操作。单击表视图单元格,然后在属性检查器中的“表视图单元格”下,将“所选内容”旁边的下拉列表更改为“无”。
带自定义单元格的 Swift 解决方案:
import Foundation
class CustomTableViewCell: UITableViewCell
{
required init(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
{
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.selectionStyle = UITableViewCellSelectionStyle.None
}
}
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
}
这是我在编写这段代码时使用的:cellForRowAtIndexPath
cell.selectionStyle = UITableViewCellSelectionStyleNone;
可以使用 UITableViewCell 的 selectionStyle 属性
cell.selectionStyle = UITableViewCellSelectionStyleNone;
或
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
另外,不要实现以下委托
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
如果您已经创建了 Xib/Storyboard 文件,则可以通过取消选中 tableview 的 setUserInteractionEnabled 属性将其更改为 No。 这将使您的表视图变为只读。
我正在使用它,这对我有用。
cell?.selectionStyle = UITableViewCellSelectionStyle.None
你只需要把这段代码放到cellForRowAtIndexPath中
要禁用单元格的选择属性:(点击单元格时)。
cell.selectionStyle = UITableViewCellSelectionStyle.None
评论
在 XIB 的 Attribute Inspector 中,将值设置为 。UITableViewCell
Selection
None
评论
SWIFT 3 的固定解决方案
cell.selectionStyle = .none
直接禁用 TableViewCell 在情节提要中的突出显示
您可以在 (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
}
方案 - 1
如果您不想在表格视图上选择某些特定单元格,则可以在cellForRow函数中为这些单元格设置选择样式。
Objective-C语言
cell.selectionStyle = UITableViewCellSelectionStyleNone;
斯威夫特 4.2
cell.selectionStyle = .none
方案 - 2
要禁用整个表视图上的选择:
Objective-C语言
self.tableView.allowsSelection = false;
斯威夫特 4.2
self.tableView.allowsSelection = false
非常简单的东西。在返回 tableview 单元格之前,请使用表视图单元格的 style 属性。
只需在返回表视图单元格之前编写此代码行即可
cell.selectionStyle = .none
在 UITableViewDataSource 协议中,在方法中添加:cellForRowAt
let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)
cell.selectionStyle = .none
return cell
或
您可以转到“情节提要”>“选择单元格”>“身份检查器”>“选择”,然后从下拉列表中选择“无”。
斯威夫特 3、4 和 5
更好的做法,编写代码UITableViewCell
例如,您有名称 ,
在只是写UITableViewCell
MyCell
awakeFromNib
self.selectionStyle = .none
完整示例:
class MyCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
self.selectionStyle = .none
}
}
禁用 UITableView 中所有 UITableViewCell 的选择
tableView.allowsSelection = false
禁用特定 UITableViewCells 的选择
cell.selectionStyle = UITableViewCell.SelectionStyle.none
我已经浏览了所有答案,对我的用例有效的方法如下:
tableView.allowSelection = false
public func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool {
true
}
这样,表格保持可聚焦,用户可以滚动浏览其元素,但无法“按下/选择”它们。
只需设置即可选择列表元素(只是不要留下灰色选择标记)。仅仅设置会导致我的桌子无法聚焦。用户将无法滚动浏览元素。cell.selectionStyle = .none
allowSelection = false
评论
selection
highlighting
disable selection
highlighting
cell.selectionStyle = .None
storyboard / cell / Selection = None