Answers:
将表格单元格的selectionStyle
属性设置为UITableViewCellSelectionStyleNone
。那应该防止它突出显示,并且您还可以在中检查该属性tableView:didSelectRowAtIndexPath:
。
要完全防止选择UITableViewCell
,请使用您的UITableViewDelegate
工具tableView:willSelectRowAtIndexPath:
。nil
如果您不想选择该行,则可以从该方法返回。
- (NSIndexPath *)tableView:(UITableView *)tv willSelectRowAtIndexPath:(NSIndexPath *)path
{
// Determine if row is selectable based on the NSIndexPath.
if (rowIsSelectable) {
return path;
}
return nil;
}
这样可以防止选择和tableView:didSelectRowAtIndexPath:
调用该行。但是请注意,这并没有阻止强调该行。
如果要防止在触摸时使该行在视觉上突出显示,可以确保将单元格selectionStyle
设置为UITableViewCellSelectionStyleNone
,或者最好使您的UITableViewDelegate
工具tableView:shouldHighlightRowAtIndexPath:
如下:
- (BOOL)tableView:(UITableView *)tv shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
// Determine if row is selectable based on the NSIndexPath.
return rowIsSelectable;
}
didSelectRowAtIndexPath
因为willSelectRowAtIndexPath
总会被调用。
用这个:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
didSelectRowAtIndexPath
仍然只叫停止选择颜色的显示。
仅适用于iOS 6+。
您可以tableView:shouldHighlightRowAtIndexPath:
在委托中实现该方法
。在此处阅读更多信息:http : //developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewDelegate_Protocol/Reference/Reference.html
苹果公司说,在didSelectRowAtIndexPath中应该做的第一件事就是取消选择行
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
然后,您可以将AccessoryType更改为选中标记,或者不进行任何更改,等等。因此,当您输入didSelectRowAtIndexPath时,可以取消选择该行,如果不想选择该行,则只需不检查该行。
另一种方法是在中添加几个类别方法UITableViewCell
。我比塞巴斯蒂安(也很好)的回答更喜欢这个,因为我建立桌子的方式。我认为这可能对其他人有帮助。
- (void)setSelectable:(BOOL)enabled {
[self setSelectionStyle:UITableViewCellSelectionStyleNone];
[self setUserInteractionEnabled:enabled];
}
- (BOOL)isSelectable {
BOOL disabled = [self selectionStyle]==UITableViewCellSelectionStyleNone &&
[self isUserInteractionEnabled];
return ! disabled;
}
斯威夫特4:
您可以通过使用UITableViewDelegate来防止选择和突出显示:shouldHighlightRowAt
此答案假定您创建了一个名为:CustomTableViewCell
的自定义单元格,
并且在该自定义单元格中创建了一个布尔值:isSelectable
func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
let cell = tableView.cellForRow(at: indexPath) as! CustomTableViewCell
if cell.isSelectable == false {
return false
} else {
return true
}
}
这是Sebastian Celis的objc答案的Swift版本。
使用tableView:willDisplayCell:forRowAtIndexPath:代替tableView:didSelectRowAtIndexPath:摆脱第一次触摸单元格时出现的闪烁。
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
若要使某些行未被选中,您必须对UITableView委托的两种方法进行一些更改。
在下面的方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
分配单元格后,编写以下代码
if(indexPath.row == someCellNumber) cell.selectionStyle =UITableViewCellSelectionStyleNone;
如果用户尝试选择上述代码,则将阻止突出显示该单元格。
在下面的此委托方法中
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if(indexPath.row == someCellNumber) return;
//for other cells write the code below...
}
如果您不写,if(indexPath.row == someCellNumber) return;
则仍然会选择行,并且有可能导致应用崩溃
tableView:shouldHighlightRowAtIndexPath:
作为由AYUSH下面提到