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?

15 Answers 15

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 
Sign up to request clarification or add additional context in comments.

3 Comments

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.
Swift 3 - cell.selectionStyle = UITableViewCellSelectionStyle.none
Or simply: cell.selectionStyle = .none
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; } 

Comments

16

From the Storyboard set the following for the Table View:

Selection: No Selection

Show Selection On Touch: False

enter image description here

Comments

13

you can do

cell.selectionStyle = UITableViewCellSelectionStyleNone; 

1 Comment

One dot is missing. Here is the fixed version: cell.selectionStyle = UITableViewCellSelectionStyle.None
6

for Swift 3 you can use

 cell.isUserInteractionEnabled = false 

5 Comments

just past that code into cellForRowAt indexPath method of table view , its simple
this method is useful when u want to user interaction disable on table view otherwise you can use method share by Mr Ben Below
Works in Swift 4 also.
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.
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.
5

Swift Syntax:

cell.selectionStyle = UITableViewCellSelectionStyle.None 

Comments

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!

Comments

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 } 

Comments

3
myTable.allowsSelection = false 

Comments

2

Update in Swift 3:

cell.selectionStyle = UITableViewCellSelectionStyle.none 

Comments

1

For Swift 3:

cell.selectionStyle = .none 

2 Comments

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 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.
1

Implement this method of UITableViewDelegate

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { return NO; } 

Comments

1

Swift 5

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell; cell.selectionStyle = .none } 

Comments

1

Swift 5

you may wanna try this too

tableView.allowsSelection = false 

Comments

0

To remove the ability of selecting any table cells, use willSelectRowAt

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { return nil } 

or by definition during table initialization (if you are not in table editing mode):

tableView.allowsSelection = false 

if you need to restrict any table cells selection during table editing:

tableView.allowsSelectionDuringEditing = false 

To remove the ability of selecting the top cell use the same function but with statement:

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { if indexPath.row == 0 { return nil } return indexPath } 

To simply remove the UI effect of selecting the element, set the selection style of the UITableViewCell to UITableViewCellSelectionStyleNone

Swift 5:

selectionStyle = .none 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.