如何禁用在UITableView中仅选择单个单元格?我有几个,我只希望最后一个被禁用。
答案 0 :(得分:52)
要停止选择某些单元格,请使用:
cell.userInteractionEnabled = NO;
除了阻止选择之外,这还会阻止tableView:didSelectRowAtIndexPath:为设置它的单元格调用。它还会使画外音像暗灰色按钮一样(可能是您想要的也可能不是)。
请注意,如果单元格中有交互元素(即开关/按钮),则需要使用cell.selectionStyle = UITableViewCellSelectionStyleNone;
,然后确保忽略tableView:didSelectRowAtIndexPath:
中单元格上的点按。
答案 1 :(得分:51)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = ...
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
答案 2 :(得分:18)
将此内容放入自定义表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;
}
然后启用/禁用someTableViewCell的选择,请执行以下操作:
[self setEnabled:state forTableViewCell:someTableViewCell];
你已经完成并可以发货。
答案 3 :(得分:10)
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self numberOfRowsInSection] == [indexPath row]) {
return nil;
} else {
return indexPath;
}
}
不会选择表格的最后一行
答案 4 :(得分:2)
正如我提到的in another thread所有上述方法都没有准确地解决问题。禁用单元格的正确方法是通过方法
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
并且在该方法中必须使用
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
禁用单元格选择但仍然允许用户与单元格的子视图交互,例如UISwitch。
答案 5 :(得分:1)
我发现的最干净的解决方案只使用了委托方法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中采取任何进一步操作,以确保忽略此单元格的选择。此单元格上的所有触摸都将被忽略,单元格中的文本也将显示为灰色。
答案 6 :(得分:0)
iOS 6。
您可以使用以下委托方法并返回NO
,以防您不选择它; YES
以防您想要选择它。
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return indexPath.section == 0;
}
答案 7 :(得分:0)
在swift中试试这个:
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
答案 8 :(得分:0)
如果有人想知道如何在swift中实现这一点,那么这是我的代码。我正在使用Xcode 7并使用iPad Retina(iOS 9)进行测试。
cell.selectionStyle = UITableViewCellSelectionStyle .None
cell.userInteractionEnabled = false
尝试根据需要放置这两行代码。在我的情况下,我在这种方法中使用它来显示单元格。
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
请记住,这两行代码会阻止您对单元格的任何选择或交互,但如果需要,您只能单独使用第一行。那是......
cell.selectionStyle = UITableViewCellSelectionStyle .None
只有这一行才会阻止您对单元格的选择。
然而,第二行将使单元格为“只读”。那是......
cell.userInteractionEnabled = false
由于
希望这有帮助。