How to Translate a Delegated Function to a IBAction Function

ⅰ亾dé卋堺 提交于 2019-12-24 11:36:08

问题


I have a delegate function that changes a UITableViewCell's section location on tap:

//On cell tap, expand
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if indexPath.section == 0
    {
        let data = firstDataSource[indexPath.row]

        tableView.beginUpdates()
        secondDataSource.append(data)
        firstDataSource.removeAtIndex(indexPath.row)

        let newIndexPath = NSIndexPath(forRow: find(secondDataSource, data)!, inSection: 1)

        tableView.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath)
        tableView.endUpdates()
    } else if indexPath.section == 1 {
        let data = secondDataSource[indexPath.row]

        tableView.beginUpdates()
        firstDataSource.append(data)
        secondDataSource.removeAtIndex(indexPath.row)

        let newIndexPath = NSIndexPath(forRow: find(firstDataSource, data)!, inSection: 0)

        tableView.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath)
        tableView.endUpdates()
    }
}

I would like for this action to occur when I fire an IBAction from a button tap, but I'm not sure how I can access the indexPath argument as is given in the delegate function. Here is my current code for the IBAction button:

@IBAction func checkOffTask(sender: UIButton) {
    var checkedOff = false


    let indexOfCell = sender.tag
    sender.setImage(UIImage(named: "checkbox-checked"), forState: UIControlState.Normal)
    self.tableView.beginUpdates()
    self.tableView.reloadRowsAtIndexPaths([NSIndexPath(forItem: indexOfCell, inSection: 1)], withRowAnimation: UITableViewRowAnimation.Automatic)
    self.tableView.endUpdates()

}

Any idea on how to get the delegate function to work for the IBAction function?


回答1:


Okay, so your action is coming from a button, that button is within a table view cell, the question is: what's the indexPath of that table view cell.

The easiest way is:

  1. get the location of the button within the table view;
  2. ask for the index path at that position.

E.g.

@IBAction func checkOffTask(sender: UIButton!) {
    let originInTableView = self.tableView.convertPoint(CGPointZero, fromView: sender)
    let indexPath = self.tableView.indexPathForRowAtPoint(originInTableView)
}



回答2:


Okay, this is a workaround I have used before. Doesn't look pretty but does the job:

UIButton *likeButton = (UIButton *)sender;
UITableViewCell *cell = (UITableViewCell *)likeButton.superview.superview;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

Just find the correct superview for the button which is of UICollectionView Class type.

P.S. - My Swift is not the best. Hoping you can convert this.



来源:https://stackoverflow.com/questions/32700208/how-to-translate-a-delegated-function-to-a-ibaction-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!