当您点击a中的某一行时UITableView
,该行会突出显示并被选中.是否可以禁用此功能,因此点击一行什么都不做?
您所要做的就是UITableViewCell
使用以下任一方法在实例上设置选择样式:
Objective-C的:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
要么
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
斯威夫特2:
cell.selectionStyle = UITableViewCellSelectionStyle.None
Swift 3和4.x:
cell.selectionStyle = .none
此外,请确保您未-tableView:didSelectRowAtIndexPath:
在表视图委托中实现,或者如果您实现它,则明确排除您不想要操作的单元格.
更多信息在这里和这里
对我来说,以下工作正常:
didSelectRowAt#
这意味着UIButton
根本行不通.也就是说,触摸桌子的一排,就这样,绝对不会做任何事情.(因此,显然,永远不会有选定的动画.)
(注意,如果,在单元格上,你有didSelectRowAt#
或任何其他控件,当然这些控件仍然可以工作.你碰巧在表格单元格上有任何控件,与UITableView允许你"选择一行"的能力完全无关使用UITableView
.)
因为我最近阅读了这篇文章,它帮助了我,我想发布另一个答案来巩固所有的答案(后代).
因此,根据您所需的逻辑和/或结果,实际上有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
根据我自己的实施经验总结我认为正确的答案:
如果要禁用某些单元格的选择,请使用:
cell.userInteractionEnabled = NO;
除了阻止选择之外,这还会阻止tableView:didSelectRowAtIndexPath:为设置它的单元格调用.(感谢Tony Million的回答,谢谢!)
如果您的单元格中有按钮需要单击,则需要改为:
[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
或此处记录的任何其他技术.
您还可以通过在检查器窗格中选择(UITableView属性)选项来禁用界面构建器本身的行选择NoSelection
,selection
如下图所示
SWIFT的固定解决方案3
cell.selectionStyle = .none
如果您希望选择仅闪光,而不是保持在选定状态,您可以打电话
didSelectRowAtIndexPath
下列
[tableView deselectRowAtIndexPath:indexPath animated:YES];
所以它会闪烁所选状态并恢复.
如果有人需要Swift的答案:
cell.selectionStyle = .None
在你UITableViewCell
的厦门国际银行在属性检查器中设置的值Selection
来None
.
这是我用的,cellForRowAtIndexPath
写这段代码:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
从UITableViewDelegate
协议中,您可以使用该方法willSelectRowAtIndexPath
,return nil
如果您不想选择该行.
以同样的方式,您可以使用该willDeselectRowAtIndexPath
方法,return nil
如果您不希望取消选择该行.
1-您所要做的就是使用以下任一方式在UITableViewCell
实例上设置选择样式:
Objective-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图像:
如果点击第3行什么都没发生,选择将保留在第二行.该功能实际上是Apple日历应用程序的添加事件时间选择屏幕的副本.
代码令人惊讶地兼容,一直到IOS2 = /:
- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 2) { return nil; } return indexPath; }
这与将选择样式设置为none一起使用,因此单元格不会在触摸事件上闪烁
我们可以写代码
cell.selectionStyle = UITableViewCellSelectionStyleNone;
但是,当我们自定义单元格厦门国际银行上述行给予警告当时的
自定义单元格xib
我们需要在界面构建器中设置选择样式None
您只需将此代码放入cellForRowAtIndexPath即可
要禁用单元格的选择属性:(在点击单元格时).
cell.selectionStyle = UITableViewCellSelectionStyle.None
试试这个
cell.selectionStyle = UITableViewCellSelectionStyleNone;
和
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
您还可以使用interfacebuilder设置选择样式.
我正在使用它,这对我有用.
cell?.selectionStyle = UITableViewCellSelectionStyle.None
虽然这是防止行在选择期间显示突出显示的最佳和最简单的解决方案
cell.selectionStyle = UITableViewCellSelectionStyleNone;
我还想建议偶尔有用的是简单地显示该行已被选中然后将其关闭.这会提醒用户确认他们打算选择的内容:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:NO]; ... }
直接禁用将TableViewCell突出显示到故事板中
禁用UItableviewcell的突出显示
cell.selectionStyle = UITableViewCellSelectionStyleNone;
并且不应该允许用户与单元格进行交互.
cell.userInteractionEnabled = NO;
您也可以将背景颜色设置为Clear以达到相同的效果UITableViewCellSelectionStyleNone
,以防您不想/不能使用UITableViewCellSelectionStyleNone
.
您将使用如下代码:
UIView *backgroundColorView = [[UIView alloc] init]; backgroundColorView.backgroundColor = [UIColor clearColor]; backgroundColorView.layer.masksToBounds = YES; [cell setSelectedBackgroundView: backgroundColorView];
这可能会降低您的性能,因为您为每个单元格添加了额外的彩色视图.
您可以使用 :
cell.selectionStyle = UITableViewCellSelectionStyleNone;
在UITableView的索引路径方法的行的单元格中.
你也可以使用:
[tableView deselectRowAtIndexPath:indexPath animated:NO];
在tableview didselectrowatindexpath方法.
你可以用它
cell.selectionStyle = UITableViewCellSelectionStyleNone;
最好的解决方案是使选择样式为无
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
但是,这里我们考虑的是以下事实:没有用于选定状态的自定义图像。
您可以使用 ....
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; [cell setSelected:NO animated:NO]; [cell setHighlighted:NO animated:NO];
快乐的编码!
您也可以从故事板中进行操作.单击表视图单元格,然后在"表视图单元格"下的属性检查器中,将"选择"旁边的下拉列表更改为"无".
Swift Solution w/Custom Cell:
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 } }
您可以使用UITableViewCell的selectionStyle属性
cell.selectionStyle = UITableViewCellSelectionStyleNone;
要么
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
另外,不要在代理下面实现
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }
如果您已创建Xib/Storyboard文件,则可以通过取消选中将 tableview的setUserInteractionEnabled属性更改为No.这将使您的tableview为只读.