swiftyboi
swiftyboi

Reputation: 3221

Why can't I select TableView cells?

This is the flow of my app:

First, the TableView is set to hidden. There is a UITextField in the center of the screen. When the user types something and hits Go, this code is run:

self.view.layoutIfNeeded()
UIView.animateWithDuration(0.5, animations: {

    self.textFieldConstraint.constant = -230
    self.tableView.hidden = false
    self.goButton.hidden = true
    self.view.layoutIfNeeded()

}, completion: nil)

At this point, the tableview is populated. When a row is selected, I need to manipulate the data that is populating it.

However, absolutely nothing happens when I tap a cell.

What am I doing wrong?

My TableView code is here:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell: SearchResultsTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! SearchResultsTableViewCell

    cell.label.text = searchResultsNames[indexPath.row]

    return cell
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return searchResultsUrls.count

}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    print("HELLO")

}

And, I have set the dataSource and delegate properly.

I also want to clarify that the tableView populates and scrolls properly; it just won't do anything when I tap a cell.

Update:

I've discovered that for some reason, I can select the cells when I press and hold them. It is not what I want, so does anybody know how to fix this?

Upvotes: 14

Views: 21973

Answers (8)

Aakarshit Jaswal
Aakarshit Jaswal

Reputation: 1

Try disabling and then enabling the user interaction Enabled property in the attribute inspector of your tableView Looks something like this

Upvotes: 0

user11107712
user11107712

Reputation: 53

If you have a gesture recognizer, just type gestureRecognizer.cancelsTouchesInView = false

Upvotes: 4

user3678889
user3678889

Reputation: 19

I met the same problem as you and solved it by removing the below code

self.view.layoutIfNeeded()

you can try it.

Upvotes: -2

Badr Bujbara
Badr Bujbara

Reputation: 8671

For me I was implementing another did select row method, so I erased it and typed "didSelect..." and selected the first one in the suggested methods, which is this for swift 3:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Row #: \(indexPath)")
}

Upvotes: 2

sookie
sookie

Reputation: 91

if you use "tap" gesture, you can't select table cell. (but, if you click and drag to right a cell, you can select it.)

Check gesture first.

And if your code has self.tableView.allowsSelection = false, replace false to true or delete this line.

Upvotes: 9

mra214
mra214

Reputation: 529

My problem has been caused by the tap gesture recognizer on the view controller itself (I had BaseTableViewController I was extending from). Probably it was interfering with the gesture recognizers of UITableView.

Upvotes: 6

Scriptable
Scriptable

Reputation: 19750

I have just used your code to create a simple table, selection is working fine and logging out HELLO as expected. Can you check the values of Selection in the attributes inspector? Here is mine, which has Selection set to Single Selection.

enter image description here

And here is the code I used for my simple table

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!

    var searchResults = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        searchResults.append("Testing 1")
        searchResults.append("Testing 2")
        searchResults.append("Testing 3")
        searchResults.append("Testing 4")
        searchResults.append("Testing 5")

        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath)
        cell.textLabel?.text = searchResults[indexPath.row]

        return cell
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchResults.count
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("HELLO")
    }
}

I also tried hiding and showing the tableView which made no difference on selection.

EDIT & SOLUTION:

In the comments below, we discovered that the issue is related to a tapGestureRecogniser on the view, This was identified by the op only being able to make a selection by holding a tap on the cell. The gesture has to fail before the selection can be made, the op managed to solve the problem by referring to this other SO Answer

Upvotes: 27

Michael Dautermann
Michael Dautermann

Reputation: 89509

In your viewDidLoad, or wherever you set up your view, make certain that your table view even allows selections. That can be controlled with the allowSelection property.

Something like:

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.allowsSelection = true
}

Upvotes: 4

Related Questions