禁用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
谢谢
希望这有助于。