davidmytton
davidmytton

Reputation: 39264

How can I disable the UITableView selection?

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?

Upvotes: 1278

Views: 545666

Answers (30)

Aks
Aks

Reputation: 8301

EDIT: for newer Swift it is changed to:

cell.selectionStyle = .none

See this for more info: https://developer.apple.com/documentation/uikit/uitableviewcell/selectionstyle

In case anyone needs answer for Swift:

cell.selectionStyle = .None

Upvotes: 42

André Herculano
André Herculano

Reputation: 1307

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.

Upvotes: 6

Rashid Latif
Rashid Latif

Reputation: 2901

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
    }
    
}

Upvotes: 20

testing
testing

Reputation: 101

Disable selection for all UITableViewCells in the UITableView

tableView.allowsSelection = false

Disable selection for specific UITableViewCells

cell.selectionStyle = UITableViewCell.SelectionStyle.none

Upvotes: 7

Abdul Karim Khan
Abdul Karim Khan

Reputation: 4945

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.

Upvotes: 11

vrat2801
vrat2801

Reputation: 548

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

Upvotes: 2

Muhammad Ahmad
Muhammad Ahmad

Reputation: 398

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

Upvotes: 1

Paulo De Barros
Paulo De Barros

Reputation:

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 

Upvotes: 654

parvind
parvind

Reputation: 907

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

cell.selectionStyle = .none


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

3 - Further,You can also do it from the storyboard. Click the table view cell and in the attributes inspector under Table View Cell, change the drop down next to Selection to None.


4 - You can disable table cell highlight 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


}

Upvotes: 29

Ahsan Ebrahim Khatri
Ahsan Ebrahim Khatri

Reputation: 1847

This is what I use ,in cellForRowAtIndexPath write this code.:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Upvotes: 31

Praful Argiddi
Praful Argiddi

Reputation: 1192

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


}

Upvotes: 3

Martin Gordon
Martin Gordon

Reputation: 36389

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

Upvotes: 2030

Kamani Jasmin
Kamani Jasmin

Reputation: 711

Directly disable highlighting of TableViewCell into storyboard

enter image description here

Upvotes: 8

Arun Gupta
Arun Gupta

Reputation: 2636

Objective-C:

  1. Below snippet disable highlighting but it also disable the call to didSelectRowAtIndexPath. So if you are not implementing didSelectRowAtIndexPath then use below method. This should be added when you are creating the table. This will work on buttons and UITextField inside the cell though.

    self.tableView.allowsSelection = NO;
    
  2. Below snippet disable highlighting and it doesn't disable the call to didSelectRowAtIndexPath. Set the selection style of cell to None in cellForRowAtIndexPath

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
  3. Below snippet disable everything on the cell. This will disable the interaction to buttons, textfields:

    self.tableView.userInteractionEnabled = false;
    

Swift:

Below are the Swift equivalent of above Objective-C solutions:

  1. Replacement of First Solution

    self.tableView.allowsSelection = false
    
  2. Replacement of Second Solution

    cell?.selectionStyle = UITableViewCellSelectionStyle.None
    
  3. Replacement of Third Solution

    self.tableView.userInteractionEnabled = false
    

Upvotes: 21

MANISH PATHAK
MANISH PATHAK

Reputation: 2650

FIXED SOLUTION FOR SWIFT 3

cell.selectionStyle = .none

Upvotes: 48

Denis Kutlubaev
Denis Kutlubaev

Reputation: 16174

Try to type:

cell.selected = NO;

It will deselect your row when needed.

In Swift3 ...

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let r = indexPath.row
    print("clicked .. \(r)")
    tableView.cellForRow(at: indexPath)?.setSelected(false, animated: true)
}

Upvotes: 20

JosephH
JosephH

Reputation: 37505

To sum up what I believe are the correct answers based on my own experience in implementing this:

If you want to disable selection for just some of the cells, use:

cell.userInteractionEnabled = NO;

As well as preventing selection, this also stops tableView:didSelectRowAtIndexPath: being called for the cells that have it set. (Credit goes to Tony Million for this answer, thanks!)

If you have buttons in your cells that need to be clicked, you need to instead:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

and you also need to ignore any clicks on the cell in - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath.

If you want to disable selection for the whole table, use:

tableView.allowsSelection = NO;

(Credit to Paulo De Barros, thanks!)

Upvotes: 92

Zaid Pathan
Zaid Pathan

Reputation: 16820

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

enter image description here

Upvotes: 38

Gaurav Patel
Gaurav Patel

Reputation: 532

You just have to put this code into cellForRowAtIndexPath

To disable the cell's selection property:(While tapping the cell).

cell.selectionStyle = UITableViewCellSelectionStyle.None

Upvotes: 11

Programming Learner
Programming Learner

Reputation: 4411

You can use :

cell.selectionStyle = UITableViewCellSelectionStyleNone;

in the cell for row at index path method of your UITableView.

Also you can use :

[tableView deselectRowAtIndexPath:indexPath animated:NO];

in the tableview didselectrowatindexpath method.

Upvotes: 6

Harini
Harini

Reputation: 303

The best solution would be Making The selection Style None

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

However, Here we are considering the fact that there are no custom images used for selected state.

Upvotes: 5

priyanka gautam
priyanka gautam

Reputation: 377

I am using this, which works for me.

cell?.selectionStyle = UITableViewCellSelectionStyle.None

Upvotes: 10

mbm29414
mbm29414

Reputation: 11598

Because I've read this post recently and it has helped me, I wanted to post another answer to consolidate all of the answers (for posterity).



So, there are actually 5 different answers depending on your desired logic and/or result:

1.To disable the blue highlighting without changing any other interaction of the cell:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

I use this when I have a UIButton - or some other control(s) - hosted in a UITableViewCell and I want the user to be able to interact with the controls but not the cell itself.

NOTE: As Tony Million noted above, this does NOT prevent tableView:didSelectRowAtIndexPath:. I get around this by simple "if" statements, most often testing for the section and avoiding action for a particular section.

Another way I thought of to test for the tapping of a cell like this is:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // A case was selected, so push into the CaseDetailViewController
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    if (cell.selectionStyle != UITableViewCellSelectionStyleNone) {
        // Handle tap code here
    }
}



2.To do this for an entire table, you can apply the above solution to each cell in the table, but you can also do this:

[tableView setAllowsSelection:NO];

In my testing, this still allows controls inside the UITableViewCell to be interactive.


3.To make a cell "read-only", you can simply do this:

[cell setUserInteractionEnabled:NO];



4.To make an entire table "read-only"

[tableView setUserInteractionEnabled:NO];



5.To determine on-the-fly whether to highlight a cell (which according to this answer implicitly includes selection), you can implement the following UITableViewDelegate protocol method:

- (BOOL)tableView:(UITableView *)tableView 
   shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath

Upvotes: 366

Jayprakash Dubey
Jayprakash Dubey

Reputation: 36447

You can use selectionStyle property of UITableViewCell

 cell.selectionStyle = UITableViewCellSelectionStyleNone;

Or

 [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

Also, do not implement below delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... }

If you have created Xib/Storyboard file then you can change setUserInteractionEnabled property of tableview to No by unchecking it. This will make your tableview to Read-Only.

Upvotes: 5

Zorayr
Zorayr

Reputation: 24962

Swift Solution w/ Custom Cell:

import Foundation

class CustomTableViewCell: UITableViewCell
{
  required init(coder aDecoder: NSCoder)
  {
    fatalError("init(coder:) has not been implemented")
  }

  override init(style: UITableViewCellStyle, reuseIdentifier: String?)
  {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.selectionStyle = UITableViewCellSelectionStyle.None
  } 
}

Upvotes: 5

Cindy
Cindy

Reputation: 384

You can also do it from the storyboard. Click the table view cell and in the attributes inspector under Table View Cell, change the drop down next to Selection to None.

Upvotes: 6

Rinku Sadhwani
Rinku Sadhwani

Reputation: 86

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:NO];
[cell setHighlighted:NO animated:NO];

Happy coding !!!

Upvotes: 5

vignesh kumar
vignesh kumar

Reputation: 2330

You can also disable selection of row from interface builder itself by choosing NoSelection from the selection option(of UITableView Properties) in inspector pane as shown in the below image

UITableView Inspector

Upvotes: 52

iDeveloper
iDeveloper

Reputation: 221

cell.selectionStyle = UITableViewCellSelectionStyleNone;

Upvotes: 6

virindh
virindh

Reputation: 3765

You Can also set the background color to Clear to achieve the same effect as UITableViewCellSelectionStyleNone, in case you don't want to/ can't use UITableViewCellSelectionStyleNone.

You would use code like the following:

UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = [UIColor clearColor];
backgroundColorView.layer.masksToBounds = YES;
[cell setSelectedBackgroundView: backgroundColorView];

This may degrade your performance as your adding an extra colored view to each cell.

Upvotes: 6

Related Questions