当前位置:  开发笔记 > 编程语言 > 正文

如何禁用UITableView选择?

如何解决《如何禁用UITableView选择?》经验,为你挑选了33个好方法。

当您点击a中的某一行时UITableView,该行会突出显示并被选中.是否可以禁用此功能,因此点击一行什么都不做?



1> Martin Gordo..:

您所要做的就是UITableViewCell使用以下任一方法在实例上设置选择样式:

Objective-C的:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

斯威夫特2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3和4.x:

cell.selectionStyle = .none

此外,请确保您未-tableView:didSelectRowAtIndexPath:在表视图委托中实现,或者如果您实现它,则明确排除您不想要操作的单元格.

更多信息在这里和这里


@Tony如果你在单元格中有一个UITextField,这是个坏主意.
@TonyMillion如果你想使用内置的编辑控件,例如刷卡到删除,这也是一个坏主意.如果将userInteractionEnabled设置为NO,则删除按钮不会响应用户触摸事件.
迟到此线程,但使用cell.allowsSelection而不是userInteraction.这会阻止单元格的交互方法,但不会阻止常规的UIView响应程序.
我将对答案进行投票,但为了清楚起见,OP仅要求禁用"突出显示",否则禁用整个单元格交互,因此所有这些评论都是非正式的.
设置cell.userInteractionEnable = No不会停止触发didSelectRowAtIndexPath.
@Tony这确实很有效,谢谢!如何将其作为答案发布,以便我们可以将其推荐到顶部?
只是为了添加一件事.在swift中,建议的变为:cell.selectionStyle = UITableViewCellSelectionStyle.None
@TonyMillion如果你想在单元格中启用UILabel文本的复制,这也是一个坏主意.

2> 小智..:

对我来说,以下工作正常:

didSelectRowAt#

这意味着UIButton根本行不通.也就是说,触摸桌子的一排,就这样,绝对不会做任何事情.(因此,显然,永远不会有选定的动画.)

(注意,如果,在单元格上,你有didSelectRowAt#或任何其他控件,当然这些控件仍然可以工作.你碰巧在表格单元格上有任何控件,与UITableView允许你"选择一行"的能力完全无关使用UITableView.)


这是如何被接受的答案,并有这么多的票?它完全没有回答这个问题!您需要在单元格上设置`selectionStyle`属性:Swift中的`cell.selectionStyle = UITableViewCellSelectionStyle.None`,或Objective-C中的`cell.selectionStyle = UITableViewCellSelectionStyleNone`.
根据需要,有几种方法可以做到这一点.没有选择风格,没有选择既可以工作,也可以都失败.这是一个例子.如果要选择单元格并调用`tableViewDidSelectRowAtIndexPath`,则需要`cell.selectionStyle = .None`.如果您不想要或不关心要调用该委托函数(即在tableViewCell中有一个textfield),那么设置`tableView.allowsSelection = false`就可以了.
这终于为我工作了,我试着用cell.selectionStyle = UITableViewCellSelectionStyleNone; 但它不起作用.有一点需要注意:它应该是:tableView.allowsSelection = NO; 不是假的.
我想,这是最好的选择.单元格上的按钮处于活动状态,但文本不活动.
这对我来说很有用.`tableView.allowSelection = false`
是的,这个答案对于给定的问题是正确的.OP想要禁用对单元格的选择.
在搜索"如何禁用uitableview didSelectRowAtIndexPath背景颜色"时导航用户是谷歌的错.所以归咎于谷歌
对我来说工作得很好,我仍然可以在我的单元格中与文本字段,选择器等进行交互
100%错误答案.这不会禁用突出显示,这将完全禁用选择
对我来说不好的解决方案 - 禁用选择.Com'on伙计们.
@nodebase怎么会有人说这个*确实*有效?我糊涂了
这最终在viewWillAppear方法中为我工作`tableView.allowsSelection = false`.

3> mbm29414..:

因为我最近阅读了这篇文章,它帮助了我,我想发布另一个答案来巩固所有的答案(后代).



因此,根据您所需的逻辑和/或结果,实际上有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


#4是一个可怕的想法,这样做也会禁用表视图中的滚动
是.如果要禁用选择但允许UIButtons等...继续支持用户交互,请使用#2.如果您想要一个完全只读的单元格,请使用#4.当然,为什么你会在非交互式单元格中拥有除UIViews或UILabels之外的任何内容.也许有人会想要在发生其他事情时禁用所有交互.
@simon实际上,这不是一个可怕的想法; 根据您的具体情况,这是一个可能或可能不是一个好选择的选项.此外,#4禁用用户滚动; 如果有必要,你仍然可以实现自己的.我同意#4没用多少,但这不是一个糟糕的主意.
如果从笔尖加载单元格设计,则复选框(在IB中)将适用于#3(和#4的表格).对于#4 vs#2,单元格内的控件是否具有交互性是有区别的吗?
为了完整性,你可以为[`tableView:shouldHighlightRowAtIndexPath:`](http://stackoverflow.com/a/13167946/2547229)添加一个喊叫声,这是_generally_(并不总是)我的首选方法.

4> JosephH..:

根据我自己的实施经验总结我认为正确的答案:

如果要禁用某些单元格的选择,请使用:

cell.userInteractionEnabled = NO;

除了阻止选择之外,这还会阻止tableView:didSelectRowAtIndexPath:为设置它的单元格调用.(感谢Tony Million的回答,谢谢!)

如果您的单元格中有按钮需要单击,则需要改为:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

你还需要忽略对单元格的任何点击- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

如果要禁用整个表的选择,请使用:

tableView.allowsSelection = NO;

(感谢Paulo De Barros,谢谢!)



5> cbowns..:

截至iOS 6.0,UITableViewDelegate已有tableView:shouldHighlightRowAtIndexPath:.(在iOS 文档中阅读它.)

此方法允许您将特定行标记为不可突出(并且隐式,不可选),而无需更改单元格的选择样式,弄乱单元格的事件处理userInteractionEnabled = NO或此处记录的任何其他技术.


偶然发现了这个线程,在此之前,我看到如此多的其他答案感到震惊。毫无疑问,这是正确的方法。
这确实是应该考虑的正确且唯一的答案。提到userInteraction的其他所有内容都是完全错误的。

6> vignesh kuma..:

您还可以通过在检查器窗格中选择(UITableView属性)选项来禁用界面构建器本身的行选择NoSelection,selection如下图所示

UITableView Inspector


最佳解决方案IMHO

7> MANISH PATHA..:

SWIFT的固定解决方案3

cell.selectionStyle = .none



8> 小智..:

如果您希望选择仅闪光,而不是保持在选定状态,您可以打电话

didSelectRowAtIndexPath

下列

[tableView deselectRowAtIndexPath:indexPath animated:YES];

所以它会闪烁所选状态并恢复.


通过这种方法,行立即突出显示,然后在半秒内消失.这就是Apple设置菜单的方式,所以它对我来说很好看.

9> Aks..:

如果有人需要Swift的答案:

cell.selectionStyle = .None



10> Zaid Pathan..:

在你UITableViewCell厦门国际银行在属性检查器中设置的值SelectionNone.

在此输入图像描述



11> Ahsan Ebrahi..:

这是我用的,cellForRowAtIndexPath写这段代码:

cell.selectionStyle = UITableViewCellSelectionStyleNone;



12> user41806..:

UITableViewDelegate协议中,您可以使用该方法willSelectRowAtIndexPath ,return nil如果您不想选择该行.

以同样的方式,您可以使用该willDeselectRowAtIndexPath方法,return nil如果您不希望取消选择该行.


我不喜欢这种方法,因为它仍会显示处于突出显示状态的单元格,直到触摸为止.
这正是我喜欢它的原因:-)

13> 小智..:

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


}



14> Arun Gupta..:

Objective-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
    



15> wzbozon..:

尝试输入:

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)
}



16> Yarek T..:

我一直在与这一点进行斗争,在我的UITableViewCell禁止使用userInteractionEnabled财产方面有控制权.我有一个3单元静态表用于设置,2有日期,1有一个开/关开关.在Storyboard/IB中玩完之后,我设法使底部不可选,但是当你点击它时,顶部行之一的选择消失了.这是我的设置UITableView的WIP图像:

设置UITableView

如果点击第3行什么都没发生,选择将保留在第二行.该功能实际上是Apple日历应用程序的添加事件时间选择屏幕的副本.

代码令人惊讶地兼容,一直到IOS2 = /:

- (NSIndexPath *)tableView: (UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 2) {
        return nil;
    }
    return indexPath;
}

这与将选择样式设置为none一起使用,因此单元格不会在触摸事件上闪烁



17> iDhaval..:

我们可以写代码

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

但是,当我们自定义单元格厦门国际银行上述行给予警告当时的

自定义单元格xib

我们需要在界面构建器中设置选择样式None



18> 小智..:

您只需将此代码放入cellForRowAtIndexPath即可

要禁用单元格的选择属性:(在点击单元格时).

cell.selectionStyle = UITableViewCellSelectionStyle.None



19> 小智..:

试试这个

cell.selectionStyle = UITableViewCellSelectionStyleNone;

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

您还可以使用interfacebuilder设置选择样式.



20> 小智..:

我正在使用它,这对我有用.

cell?.selectionStyle = UITableViewCellSelectionStyle.None



21> Steve Barden..:

虽然这是防止行在选择期间显示突出显示的最佳和最简单的解决方案

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我还想建议偶尔有用的是简单地显示该行已被选中然后将其关闭.这会提醒用户确认他们打算选择的内容:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     [tableView deselectRowAtIndexPath:indexPath animated:NO];
...
}



22> Kamani Jasmi..:

直接禁用将TableViewCell突出显示到故事板中

在此输入图像描述



23> Sharme..:

禁用UItableviewcell的突出显示

cell.selectionStyle = UITableViewCellSelectionStyleNone;

并且不应该允许用户与单元格进行交互.

cell.userInteractionEnabled = NO;



24> virindh..:

您也可以将背景颜色设置为Clear以达到相同的效果UITableViewCellSelectionStyleNone,以防您不想/不能使用UITableViewCellSelectionStyleNone.

您将使用如下代码:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

这可能会降低您的性能,因为您为每个单元格添加了额外的彩色视图.



25> Annu..:

您可以使用 :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

在UITableView的索引路径方法的行的单元格中.

你也可以使用:

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在tableview didselectrowatindexpath方法.



26> iEinstein..:

你可以用它

cell.selectionStyle = UITableViewCellSelectionStyleNone;



27> Harini..:

最好的解决方案是使选择样式为无

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

但是,这里我们考虑的是以下事实:没有用于选定状态的自定义图像。



28> Mak083..:

您可以使用 ....

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];



29> 小智..:
cell.selectionStyle = UITableViewCellSelectionStyleNone;



30> 小智..:
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

快乐的编码!



31> 小智..:

您也可以从故事板中进行操作.单击表视图单元格,然后在"表视图单元格"下的属性检查器中,将"选择"旁边的下拉列表更改为"无".



32> Zorayr..:

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
  } 
}



33> Jayprakash D..:

您可以使用UITableViewCell的selectionStyle属性

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

要么

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

另外,不要在代理下面实现

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

如果您已创建Xib/Storyboard文件,则可以通过取消选中将 tableview的setUserInteractionEnabled属性更改为No.这将使您的tableview为只读.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有