UITableview:如何禁用某些行而不是其他行的选择

War*_*ior 284 iphone objective-c uitableview ios

我正在显示tableview从XML解析的组内容.我想禁用它上面的click事件(我根本不应该单击它)该表包含两个组.我想禁用第一组的选择,但不禁用第二组.单击第二组的第一行navigates到我的管player view.

如何才能选择特定的组或行?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if(indexPath.section!=0)
    if(indexPath.row==0)    

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:tubeUrl]];   
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Pug*_*gal 482

你只需要把这段代码放进去 cellForRowAtIndexPath

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

cell.selectionStyle = UITableViewCellSelectionStyleNone;
Run Code Online (Sandbox Code Playgroud)

能够选择(点击)单元格:(点击单元格)

// Default style
cell.selectionStyle = UITableViewCellSelectionStyleBlue;

// Gray style
cell.selectionStyle = UITableViewCellSelectionStyleGray;
Run Code Online (Sandbox Code Playgroud)

请注意,当用户触摸时,具有selectionStyle = UITableViewCellSelectionStyleNone;仍然会导致UI调用的单元格didSelectRowAtIndexPath.为避免这种情况,请按照以下建议进行操作并进

cell.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)

代替.另请注意,您可能希望将项目设置cell.textLabel.enabled = NO;为灰色.

  • 这是黑客!这样做,使用下面的答案 - 使用willSelectRowAtIndexPath返回nil! (110认同)
  • 在iOS 6.0及更高版本中,`tableView:shouldHighlightRowAtIndexPath:`是一个新的`UITableViewDelegate`方法,它根据是否应突出显示传递的`indexPath`返回一个`BOOL`.如果您正在构建6.0及更高版本,我强烈推荐这个新API. (23认同)
  • userInteractionEnabled的东西不正确,钩子willSelectRowAtIndexPath代替人们注意. (4认同)
  • 如果你在Swift中这样做而你遇到麻烦但最终到了这里,你需要设置`cell!.selectionStyle = .None`强制解包单元格,允许你访问它的属性. (2认同)

Bri*_*dos 355

如果要使行(或行的子集)不可选,请实现该UITableViewDelegate方法-tableView:willSelectRowAtIndexPath:(也由TechZen提及).如果不indexPath应该是可选择的,则返回nil,否则返回indexPath.要获取默认选择行为,只需将indexPath传递给delegate方法返回,但您也可以通过返回不同来更改行选择indexPath.

例:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // rows in section 0 should not be selectable
    if ( indexPath.section == 0 ) return nil;

    // first 3 rows in any section should not be selectable
    if ( indexPath.row <= 2 ) return nil;

    // By default, allow row to be selected
    return indexPath;
}
Run Code Online (Sandbox Code Playgroud)

  • 我还想补充一点,这是正确的答案,但你也应该在cellForRowAtIndexPath中将selectionStyle设置为UITableViewCellSelectionStyleNone.为什么?因为没有这种选择样式,单元格无法被选中,但是当它被触摸时它仍将显示为"被选中"(因此如果其他单元格中有一个,它将变为所选颜色) (21认同)
  • 这不应该是最好的答案吗?这更正确. (14认同)
  • 这应该比接受的答案有更多的赞成 (4认同)
  • 小细节:你<= 2,不是= <2.笑脸不好!:) (2认同)
  • 我认为这不是公认的答案的主要原因是因为接受的答案更容易.虽然这不是"最好的方法",因为你的表仍会在你的单元格上调用setSelected:它仍然可以在视觉上工作.这里的答案需要更多的工作,但这是正确的方法(你必须结合@TooManyEduardos建议),以避免在你的单元格上调用setSelected:表的任何不可预见的后果. (2认同)

Kel*_*ler 57

从iOS 6开始,您可以使用

-tableView:shouldHighlightRowAtIndexPath:
Run Code Online (Sandbox Code Playgroud)

如果您返回NO,则会禁用选择突出显示和连接到该单元格的故事板触发的segues.

当触摸在一行上时调用该方法.返回NO该消息将停止选择过程,并且在触摸关闭时不会导致当前选定的行丢失其选定的外观.

UITableViewDelegate协议参考

  • 同意.对于iOS 7及以上版本,这应该是首选方法(实际上在iOS 8上,其他方法对我来说都不适用.) (3认同)

Mig*_*use 16

以上答案中没有一个能够正确解决问题.原因是我们要禁用单元格的选择,但不一定要禁用单元格内的子视图.

在我的情况下,我在行的中间呈现了一个UISwitch,我想禁用行的其余部分的选择(这是空的)但不是为了切换!因此,在该方法中这样做的正确方法

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

表格的陈述

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
Run Code Online (Sandbox Code Playgroud)

禁用特定单元格的选择,同时允许用户操作开关,从而使用适当的选择器.如果某人通过网络禁用用户交互,则情况并非如此

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

仅准备单元格并且不允许与UISwitch交互的方法.

而且,使用该方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

为了取消选择具有表单声明的单元格

[tableView deselectRowAtIndexPath:indexPath animated:NO];
Run Code Online (Sandbox Code Playgroud)

仍然显示在用户按下单元格的原始contentView时选择的行.

只是我的两分钱.我很确定很多人会觉得这很有用.


Tec*_*Zen 11

使用这些数据源方法捕获选择.

– tableView:willSelectRowAtIndexPath: 
– tableView:didSelectRowAtIndexPath: 
– tableView:willDeselectRowAtIndexPath: 
– tableView:didDeselectRowAtIndexPath:
Run Code Online (Sandbox Code Playgroud)

在这些方法中,您可以检查所选行是否是您想要选择的行.如果是,采取行动,如果没有,什么都不做.

不幸的是,你不能只关闭一个部分的选择.这是整张桌子还是什么都没有.

但是,您可以将表格单元格selectionStyle属性设置为UITableViewCellSelectionStyleNone.我相信这会让选择变得无形.结合上述方法,从用户的角度来看,应该使细胞看起来完全惰性.

Edit01:

如果您的表中只有一些行是可选择的,那么可选行的单元格在视觉上与不可选行不同是很重要的.雪佛龙配件按钮是执行此操作的默认方式.

但是,如果你这样做,你不希望你的用户试图选择行并认为应用程序有错误,因为该行没有做任何事情.

  • @Warrior:如果您已安装SDK,则可以打开Xcode,转到"帮助 - >开发人员文档",然后将这些方法名称复制到搜索字段中以查看其工作原理.Developer文档还包含示例代码. (2认同)

Ale*_*ano 11

例如,对于Swift 4.0:

cell.isUserInteractionEnabled = false
cell.contentView.alpha = 0.5
Run Code Online (Sandbox Code Playgroud)


azf*_*far 9

您需要执行以下操作以禁用cellForRowAtIndexPath方法中的单元格选择:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
[cell setUserInteractionEnabled:NO];
Run Code Online (Sandbox Code Playgroud)

要显示灰显的单元格,请在tableView:WillDisplayCell:forRowAtIndexPath方法中添加以下内容:

[cell setAlpha:0.5];
Run Code Online (Sandbox Code Playgroud)

一种方法允许您控制交互性,另一种方法允许您控制UI外观.


Esq*_*uth 8

对于快速:

cell.selectionStyle = .None
cell.userInteractionEnabled = false
Run Code Online (Sandbox Code Playgroud)


Jos*_*phH 5

要停止选择某些单元格,请使用:

cell.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)

除了阻止选择之外,这还会阻止tableView:didSelectRowAtIndexPath:为设置它的单元格调用.

  • @ Philip007如果您正在重复使用单元格,则需要将其重置为"是",以便您**想要成为交互式单元格.否则,如果连续重复使用"NO"单元格,您确实希望它是交互式的,它仍将被禁用.ie:`if [indexPath row] == 0){set to NO} else {set to YES}` (6认同)
  • @ Philip007"NO"细胞是否被重复使用?如果是这样,您可能需要确保在单元格出列时将其设置为"YES". (3认同)

Abd*_*man 5

您可以使用该tableView:willDisplayCell方法对tableViewCell进行各种自定义。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
     [cell setUserInteractionEnabled:NO];

     if (indexPath.section == 1 && indexPath.row == 0)
     {
         [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
         [cell setUserInteractionEnabled:YES];
     }
} 
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,用户只能选择tableView第二部分中的第一行。其余所有行均无法选择。谢谢〜


Sof*_*ner 5

我基于数据模型的解决方案:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled ? indexPath : nil
}

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    let rowDetails = viewModel.rowDetails(forIndexPath: indexPath)
    return rowDetails.enabled
}
Run Code Online (Sandbox Code Playgroud)


Nil*_*esh 5

对于Swift 4.0,这可以解决问题。它将在didSelectRowAtIndexPath方法中禁用单元格,但保持子视图可单击。

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
         if (indexPath.row == clickableIndex ) { 
            return indexPath
         }else{
            return nil
        }
    }
Run Code Online (Sandbox Code Playgroud)