Javier Artiles
Javier Artiles

Reputation: 175

didSelectRowAtIndexPath not being called (Swift)

I've been going in circles for a while and nothing I've found in related posts seems to solve it. I'm programmatically adding a table to a custom UIView. The table and row text displays correctly, but neither didSelectRowAtIndexPath nor willdSelectRowAtIndexPath fire when I run this on the simulator and try to click on any of the rows.

The relevant bits of my code below:

import UIKit
import AVFoundation

@IBDesignable
class PerformanceQuestionView: UIView, UITableViewDelegate, UITableViewDataSource {

var optionsTable = UITableView(frame: CGRectMake(10,200,250,200))

var optionItems = ["One", "Two", "Three", "Four"]

convenience init(rect: CGRect, performanceQuestion:PerformanceQuestion?) {
    self.init(frame: rect)

    NSLog("PerformanceQuestionView.init()")

    self.optionsTable.dataSource = self
    self.optionsTable.delegate   = self
    self.optionsTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    self.optionsTable.allowsSelection   = true
}

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    NSLog("numberOfRowsInSection")
    return optionItems.count
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    NSLog("cellForRowAtIndexPath")
    var cell:UITableViewCell = self.optionsTable.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    cell.textLabel.text = self.optionItems[indexPath.row]

    return cell
}

func tableView(tableView: UITableView!, willSelectRowAtIndexPath indexPath: NSIndexPath!) -> NSIndexPath! {
    NSLog("You will select cell #\(indexPath.row)!")
    return indexPath
}

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    NSLog("You selected cell #\(indexPath.row)!")
}

override func layoutSubviews() {

    super.layoutSubviews()

    self.addSubview(optionsTable)
}

}

Upvotes: 12

Views: 16939

Answers (8)

Priyank Patel
Priyank Patel

Reputation: 870

You need to add below code for Tap or Pan gesture.You need to tap.cancelsTouchesInView = false

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)
    tap.cancelsTouchesInView = false

OR

     let gesture = UITapGestureRecognizer(target: self, action:  #selector(self.mainBlurViewAction))
      mainBlurView.addGestureRecognizer(gesture)
      gesture.cancelsTouchesInView = false

Then it will work

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
   //Call According requirement
}

Upvotes: 2

D. Rothschild
D. Rothschild

Reputation: 719

For Swift 3.0, you need to use this function exactly:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 //Input your code here

}

Look very closely to make sure you are using this function. The compiler won't complain if you have NSIndexPath or you don't have _ before tableView but it won't work. So use this function, put a breakpoint in and you will see it go to that point when you tap on a row.

I was testing this with a static table (all static content cells).

Upvotes: 1

ICL1901
ICL1901

Reputation: 7778

I tried all of the methods listed in this question and others. I finally deleted the table from my storyboard and started again.

In my storyboard, I added back the table, added a prototype cell. I connected the ViewController to the table. I connected the table to my dataSource and delegate methods.

I named the prototype identifier in the Attributes Inspector.

This worked for me. I did not apparently have any code to change.

Upvotes: 0

Ozzie Perez
Ozzie Perez

Reputation: 583

This was deprecated in Swift 3:

override func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    ... 
}

And replaced with:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    ...
}

Upvotes: 0

Gihan
Gihan

Reputation: 2536

Reason for this could be, you are using a pan gesture in the view. like AAA mentioned removing your pan gesture will do the trick. But if you still want to use the pan gesture you could do the following

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)
    tap.cancelsTouchesInView = false

Making cancelsTouchesInView, false will enable all you taps.

Upvotes: 22

jose920405
jose920405

Reputation: 8049

I have the same problem long time, I am for thinking it's a bug in UITableView programmatically when creating a UIView class.

My temporary solution and although it is not a good idea, but it works. It is to place a button the size of the cell and have an action dispatched by a protocol, to achieve at least simulate this action.

It is not good practice but could not stay stuck there longer.

Upvotes: 1

AAA
AAA

Reputation: 1977

Removing the TapGestureRecognizer worked for me!!!

    // var backgoroundTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "DismissKeyboard")
    // self.view.addGestureRecognizer(backgoroundTap)

Upvotes: 27

Aaron Brager
Aaron Brager

Reputation: 66242

Remove the exclamation points:

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

}

Upvotes: 3

Related Questions