禁用select一个单一的UITableViewCell

你如何禁用在UITableView中只select一个单元格? 我有几个,我只希望最后被禁用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = ... cell.selectionStyle = UITableViewCellSelectionStyleNone; } 

要停止一些被选中的单元格,请使用:

 cell.userInteractionEnabled = NO; 

除了防止select,这也停止tableView:didSelectRowAtIndexPath:被设置的单元格被调用。 它也将使配音视为一个变暗的button相同(这可能会或可能不是你想要的)。

请注意,如果在单元格中有交互式元素(即开关/button),则需要使用cell.selectionStyle = UITableViewCellSelectionStyleNone; 相反,然后确保忽略在tableView:didSelectRowAtIndexPath:单元格上的水龙头。

把这个放在你自定义的表格VC中:

 // cells lacking UITableViewCellAccessoryDisclosureIndicator will not be selectable - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; if (cell.accessoryType != UITableViewCellAccessoryDisclosureIndicator) { return nil; } return indexPath; } // disabled cells will still have userinteraction enabled for their subviews - (void)setEnabled:(BOOL)enabled forTableViewCell:(UITableViewCell *)tableViewCell { tableViewCell.accessoryType = (enabled) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; // if you dont want the blue selection on tap, comment out the following line tableViewCell.selectionStyle = (enabled) ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone; } 

然后,要启用/禁用某些TableViewCell的select,请执行以下操作:

 [self setEnabled:state forTableViewCell:someTableViewCell]; 

你完成了,可以发货。

 -(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self numberOfRowsInSection] == [indexPath row]) { return nil; } else { return indexPath; } } 

表格的最后一行不会被选中

正如我在另一个线程中提到的,所有上述方法都不能精确地解决问题。 禁用单元的正确方法是通过该方法

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

在这个方法中必须使用

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 

禁用单元格select,但仍然允许用户与单元格的子视图(如UISwitch)进行交互。

我发现的最干净的解决scheme只使用委托方法willDisplayCell。

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([indexPath row] == 0) //<-----ignores touches on first cell in the UITableView { //simply change this around to suit your needs cell.userInteractionEnabled = NO; cell.textLabel.enabled = NO; cell.detailTextLabel.enabled = NO; } } 

您不必在委托方法didSelectRowAtIndexPath中采取任何进一步操作,以确保忽略此单元格的select。 所有涉及这个单元格的内容都将被忽略,单元格中的文本也会变灰。

与iOS 6。

你可以使用下面的委托方法,并在没有被select的情况下返回NO ,如果你希望被select,则返回YES

 - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return indexPath.section == 0; } 

快速尝试这个:

 self.tableView.deselectRowAtIndexPath(indexPath, animated: true) 

如果有人想知道如何迅速实现这个,那么这里是我的代码。 我正在使用Xcode 7并使用iPad Retina(iOS 9)进行testing。

 cell.selectionStyle = UITableViewCellSelectionStyle .None cell.userInteractionEnabled = false 

尝试把这两行代码,无论你想要的。 在我的情况下,我用这个方法来显示细胞。

 override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

请记住,这两行代码将阻止任何types的select或交互到您的单元格,但只能单独使用第一行,如果你想。 那是…

 cell.selectionStyle = UITableViewCellSelectionStyle .None 

只有这一行将阻止select到你的单元格。

但是第二行将使单元格为“只读”。 那是..

 cell.userInteractionEnabled = false 

谢谢

希望这有助于。