78

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?

Sheehan Alam
  • 60,111
  • 124
  • 355
  • 556

14 Answers14

87

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
John Wang
  • 6,136
  • 2
  • 28
  • 23
  • 85
    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:](http://stackoverflow.com/a/812921/172218) on your `UITableViewDelegate` and return nil for non-selectable rows. – j b Apr 19 '13 at 11:51
  • 1
    Swift 3 - `cell.selectionStyle = UITableViewCellSelectionStyle.none` – Johannes Knust Mar 12 '17 at 18:56
  • 4
    Or simply: `cell.selectionStyle = .none` – spencer.sm Apr 30 '18 at 23:13
65

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;
}
malhal
  • 26,330
  • 7
  • 115
  • 133
16

From the Storyboard set the following for the Table View:

Selection: No Selection

Show Selection On Touch: False

enter image description here

Eduardo Irias
  • 1,043
  • 11
  • 12
13

you can do

cell.selectionStyle = UITableViewCellSelectionStyleNone;
DD_
  • 7,230
  • 11
  • 38
  • 59
Anju
  • 524
  • 1
  • 6
  • 17
6

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
  • Works in Swift 4 also. – leanne Dec 20 '17 at 23:13
  • 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
5

Swift Syntax:

cell.selectionStyle = UITableViewCellSelectionStyle.None
Dustin Williams
  • 3,912
  • 2
  • 16
  • 19
5

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.

Utilities Sidebar

Make the Selection: None

That's all!

mythicalcoder
  • 3,143
  • 1
  • 32
  • 42
5

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        
}
3
myTable.allowsSelection = false
2

Update in Swift 3:

cell.selectionStyle = UITableViewCellSelectionStyle.none
Ben
  • 946
  • 1
  • 11
  • 19
1

Implement this method of UITableViewDelegate

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return NO;
}
Axel Guilmin
  • 11,454
  • 9
  • 54
  • 64
Raymond
  • 1,172
  • 16
  • 20
1

For Swift 3:

cell.selectionStyle = .none
David Villegas
  • 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
1

Swift 5

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell;
    cell.selectionStyle = .none
}
Enamul Haque
  • 4,789
  • 1
  • 37
  • 50
1

Swift 5

you may wanna try this too

tableView.allowsSelection = false
HanKBeatz
  • 152
  • 1
  • 1
  • 10