I want to add a tap gesture to every cell in a UITableView
that edits the content in it. The two ways to add a gesture are in code or through storyboard. I tried both and they failed.
Can I add a gesture to every cell in table with storyboard drag and drop? It seems to only add gesture to the first cell. Adding gesture in code, I wrote something like,
addGestureRecognizer(UITapGestureRecognizer(target: self,action:#selector(MyTableViewCell.tapEdit(_:))))
or
addGestureRecognizer(UITapGestureRecognizer(target: self, action:"tapEdit:"))
both work. But I'd like to let the UITableViewController
handle this gesture because it does something with the datasource. How do I write my target and action?
EDIT:
addGestureRecognizer(UITapGestureRecognizer(target: MasterTableViewController.self, action:#selector(MasterTableViewController.newTapEdit(_:)))
it induce an error said, unrecognized selector sent to class 0x106e674e0...
To add gesture to UITableViewCell, you can follow the steps below:
First, add gesture recognizer to UITableView
Then, define the selector. Use
recognizer.locationInView
to locate the cell you tap in tableView. And you can access the data in your dataSource bytapIndexPath
, which is the indexPath of the cell the user tapped.It is possible to add gesture directly to TableView cell and access the datasource in viewController, You need to set up a delegate:
In your custom cell:
In your viewController:
However, this method could cause problems, see UIGestureRecognizer and UITableViewCell issue. In this case, when the swipe gesture successes, the selector get called twice for some reason. I can't say the second method is a bad one as I haven't found any direct evidence yet, but after searching through Google, it seems like the first method is the standard way.
You don't need to add gesture recognizer to achieve what you are doing.
UITableViewDelegate
methodtableView:didSelectRowAtIndexPath:
to detect which row is tapped (this is what exactly yourtapGesture
is going to do) and then do your desired processing.tableView:didEndDisplayingCell:forRowAtIndexPath:
just before returning the cell:cell?.selectionStyle = .None
The easiest way to do this is to add the gesture in a custom
UITableViewCell
. An easier alternative to setting up a custom delegate pattern is to inform the view controller of the edits would be to use a handler in the form of a closure that the view controller can provide and which is called when user editing is finished. I'm assuming a textField is used to allow cell editing.And within your custom
UITableViewController
, pass in the handler to be able to make changes to your model. Don't forget to account for possible memory cycles in the closure.Adding gesture in awakeFromNib method seems much more easier and works fine.