How can I disable the UITableView selection?

Viewed 520819

When you tap a row in a UITableView, the row is highlighted and selected. Is it possible to disable this so tapping a row does nothing?

42 Answers

All you have to do is set the selection style on the UITableViewCell instance using either:

Objective-C:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

or

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Swift 2:

cell.selectionStyle = UITableViewCellSelectionStyle.None

Swift 3 and 4.x:

cell.selectionStyle = .none

Further, make sure you either don't implement -tableView:didSelectRowAtIndexPath: in your table view delegate or explicitly exclude the cells you want to have no action if you do implement it.

More info here and here

For me, the following worked fine:

tableView.allowsSelection = false

This means didSelectRowAt# simply won't work. That is to say, touching a row of the table, as such, will do absolutely nothing. (And hence, obviously, there will never be a selected-animation.)

(Note that if, on the cells, you have UIButton or any other controls, of course those controls will still work. Any controls you happen to have on the table cell, are totally unrelated to UITableView's ability to allow you to "select a row" using didSelectRowAt#.)

Another point to note is that: This doesn't work when the UITableView is in editing mode. To restrict cell selection in editing mode use the code as below:

tableView.allowsSelectionDuringEditing = false 

In your UITableViewCell's XIB in Attribute Inspector set value of Selection to None.

enter image description here

From the UITableViewDelegate Protocol you can use the method willSelectRowAtIndexPath and return nil if you don't want the row selected.

In the same way the you can use the willDeselectRowAtIndexPath method and return nil if you don't want the row to deselect.

Swift 3,4 and 5

Better practice, write code in UITableViewCell

For example, you have UITableViewCell with the name MyCell, In awakeFromNib just write self.selectionStyle = .none

Full example:

class MyCell: UITableViewCell {
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
    }
    
}

We can write code like

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

but when we have custom cell xib above line give warning at that time for

custom cell xib

we need to set selection style None from the interface builder

From UITableViewDataSource Protocol, inside method cellForRowAt add:

let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_CELL_IDENTIFIER", for: indexPath)                
cell.selectionStyle = .none
return cell

OR

You can goto Storyboard > Select Cell > Identity Inspector > Selection and select none from dropdown.

Disable selection for all UITableViewCells in the UITableView

tableView.allowsSelection = false

Disable selection for specific UITableViewCells

cell.selectionStyle = UITableViewCell.SelectionStyle.none

I've gone through all answers and what worked for my use case was the following:

tableView.allowSelection = false
public func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool {
    true
}

This way the table remains focusable, the user can scroll through its elements but is unable to "press / select" them.

Simply setting cell.selectionStyle = .none will allow the list element to be selectable (just not leave a gray selection mark behind). And just setting allowSelection = false would cause my table not to be focusable. Users wouldn't be able to scroll through the elements.

You can disable table cell highight using below code in (iOS) Xcode 9 , Swift 4.0

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


        let cell = tableView.dequeueReusableCell(withIdentifier: "OpenTbCell") as! OpenTbCell
        cell.selectionStyle = .none
        return cell


}

Scenario - 1

If you don't want selection for some specific cells on the tableview, you can set selection style in cellForRow function for those cells.

Objective-C

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Swift 4.2

cell.selectionStyle = .none

Scenario - 2

For disabling selection on the whole table view :

Objective-C

self.tableView.allowsSelection = false;

Swift 4.2

self.tableView.allowsSelection = false

Very simple stuff. Before returning the tableview Cell use the style property of the table view cell.

Just write this line of code before returning table view cell
cell.selectionStyle = .none

Related