I have a cell that I am inserting to the top of a UITableView. How can I make sure that when the user clicks on the cell, it doesn't show the blue selected indicator?
14 Answers
To remove the ability of selecting any table cells, or particular table cells based on the row index, use willSelectRowAt
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
return nil
}
To simply remove the UI effect of selecting the element, set the selection style of the UITableViewCell to UITableViewCellSelectionStyleNone
Swift 5:
selectionStyle = .none

- 472
- 4
- 9

- 6,136
- 2
- 28
- 23
-
85This doesn't make the cell non-selectable it just means the visual appearance of the cell doesn't change when it is selected. `tableView:didSelectRowAtIndexPath:` still gets called when the cell is tapped. To actually prevent selection you need to [implement tableView:willSelectRowAtIndexPath:](http://stackoverflow.com/a/812921/172218) on your `UITableViewDelegate` and return nil for non-selectable rows. – j b Apr 19 '13 at 11:51
-
1Swift 3 - `cell.selectionStyle = UITableViewCellSelectionStyle.none` – Johannes Knust Mar 12 '17 at 18:56
-
4Or simply: `cell.selectionStyle = .none` – spencer.sm Apr 30 '18 at 23:13
To make a cell completely non-selectable on a per-cell basis two things are required:
1- As others said:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
2- Implement this delegate method as follows:
// Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
if(cell.selectionStyle == UITableViewCellSelectionStyleNone){
return nil;
}
return indexPath;
}

- 26,330
- 7
- 115
- 133
From the Storyboard set the following for the Table View:
Selection: No Selection
Show Selection On Touch: False

- 1,043
- 11
- 12
you can do
cell.selectionStyle = UITableViewCellSelectionStyleNone;
-
1One dot is missing. Here is the fixed version: cell.selectionStyle = UITableViewCellSelectionStyle.None – Oleg Popov Sep 04 '15 at 18:11
for Swift 3 you can use
cell.isUserInteractionEnabled = false
-
just past that code into cellForRowAt indexPath method of table view , its simple – Sep 13 '17 at 06:05
-
this method is useful when u want to user interaction disable on table view otherwise you can use method share by Mr Ben Below – Sep 13 '17 at 06:14
-
-
It is working fine for me. Should be the correct answer. Another way is that in `tableView:didSelectRowAtIndexPath` delegate method, detect cell index and just do nothing and return. – Yongxiang Ruan Sep 07 '18 at 17:10
-
My favorite part about this answer is that you can declare it INSIDE the cell. If you have a cell (like an empty state cell) that you never want to respond to taps, this is a good way to go. – Maxwell Jul 01 '20 at 21:40
Swift Syntax:
cell.selectionStyle = UITableViewCellSelectionStyle.None

- 3,912
- 2
- 16
- 19
I am answering from point of view of disabling TableViewCell. You can use the storyboard.
XCode Version 8.2.1 (8C1002)
Select the TableVewCell on storyboard and following will be visible on the right side panel - Utilities.
Make the Selection: None
That's all!

- 3,143
- 1
- 32
- 42
The question was how to make certain cells selectable and others not. This was my solution, (after trying lots of other suggestions):
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
if (indexPath.row == 1 || indexPath.row == 2) {
return indexPath
}
return nil
}

- 71
- 1
- 1
Implement this method of UITableViewDelegate
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}

- 11,454
- 9
- 54
- 64

- 1,172
- 16
- 20
For Swift 3:
cell.selectionStyle = .none

- 458
- 3
- 18
-
As suggested Above "This doesn't make the cell non-selectable it just means the visual appearance of the cell doesn't change when it is selected. tableView:didSelectRowAtIndexPath: still gets called when the cell is tapped. To actually prevent selection you need to implement tableView:willSelectRowAtIndexPath: on your UITableViewDelegate and return nil for non-selectable rows. –" – Siyavash Sep 08 '17 at 14:50
-
2@Siyavash as indicated in the original question, this person only wants to hide "the blue selected indicator". That is not the same as wanting to make it completely non-selectable. Simply put the person asking the question is only trying to hide visual indication of a selection. – David Villegas Oct 30 '17 at 16:49
Swift 5
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell;
cell.selectionStyle = .none
}

- 4,789
- 1
- 37
- 50