I have created a custom TableViewCell
and currently have a button placed in the cell. When the button is pressed, In the tableviewcell.swift
file, IBAction func
gets executed. I cannot figure out how to determine the index path of the cell that the button is in that is pressed. I was trying to use the following
@IBAction func employeeAtLunch(sender: AnyObject) {
let indexPath = (self.superview as! UITableView).indexPathForCell(self)
println("indexPath?.row")
}
but I get the following error on click:
Could not cast value of type 'UITableViewWrapperView' to 'UITableView'
Any help on how to access the index path of the cell?
In your situation, I will add a tag to your button to identify in which row it is. Whenever I configure cell in the call-back
cellForRowAtIndexPath
, I update this tag value.When a button clicked, the handler specifies always the button pressed. With the tag defined to that pressed button, you can know the button of which row is pressed.
If your tableview has more than 1 sections, you will have to setup the value of tags the right way.
The second solution which is better: get the position of the button in your tableView, then get indexpath of that position in your tableview:
You are just assuming that the cell's immediate superview is the table view - wrongly. There is no particular reason why that should be so (and indeed it is not). Work with fewer assumptions! You need to keep walking up the superview chain until you do reach the table, like this:
Now
v
is the table view, and you can proceed to work out what row this is.What I would actually do, however, is work my up, not from the cell to the table, but from the button to the cell. The technique is exactly the same:
Do that the button's action method, where
sender
is the button. If the target of the action method is the table view controller, it has access to the table, and the problem is solved.You could subclass
UIButton
in your cell with a property for its row.Then when you set up your table view, in the
cellForRowAtIndexPath
method, you set therow
property:This way when the action fires, you can get the correct row: