表格视图单元格中的UIButton动作

我正在试图在表视图单元格中按下button的操作。 以下代码在我的表视图控制器类中。

在我的UITableViewCell类叫做requestsCell的sockets中,button被描述为“是”。

我正在使用Parse保存数据,并希望按下button时更新对象。 我的objectIds数组工作正常,cell.yes.tag也打印正确的号码的日志,但是,我不能把这个号码到我的“连接”function,以正确运行我的查询。

我需要一种方法来获取单元格的indexPath.row来find适当的objectId。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as requestsCell // Configure the cell... cell.name.text = requested[indexPath.row] imageFiles[indexPath.row].getDataInBackgroundWithBlock{ (imageData: NSData!, error: NSError!) -> Void in if error == nil { let image = UIImage(data: imageData) cell.userImage.image = image }else{ println("not working") } } cell.yes.tag = indexPath.row cell.yes.targetForAction("connected", withSender: self) println(cell.yes.tag) return cell } func connected(sender: UIButton!) { var query = PFQuery(className:"Contacts") query.getObjectInBackgroundWithId(objectIDs[sender.tag]) { (gameScore: PFObject!, error: NSError!) -> Void in if error != nil { NSLog("%@", error) } else { gameScore["connected"] = "yes" gameScore.save() } } } 

您需要添加该button的目标。

 myButton.addTarget(self, action: "connected:", forControlEvents: .TouchUpInside) 

当然你需要设置该button的标签,因为你正在使用它。

 myButton.tag = indexPath.row 

你可以通过inheritanceUITableViewCell来实现这一点。 在界面生成器中使用它,在该单元上放下一个button,通过sockets连接,然后就可以了。

编辑:要获得连接的function中的标记:

 func connected(sender: UIButton){ let buttonTag = sender.tag } 

EDIT2:

这个答案提供了swift 1.2,正如评论中所build议的那样,语法对于swift 2.2是有点不同的。

 myButton.addTarget(self, action: #selector(ClassName.FunctionName(_:), forControlEvents: .TouchUpInside) 

EDIT3:

更新了Swift 3

 myButton.addTarget(self, action: #selector(ClassName.FunctionName.buttonTapped), for: .touchUpInside) 

使用button.tag作为信息载体的被接受的答案实际上已经按下了button,是可靠的并且被广泛接受,但由于标签只能容纳Int而受到限制。

你可以使用Swift的真棒closuresfunction来获得更大的灵活性和更干净的代码。

我推荐这篇文章: 如何正确使用 Jure Zove的Swift闭包在表视图单元格中执行button 。

适用于你的问题:

  1. 声明一个variables,可以在你的tableview 单元格中保存一个闭包

     var buttonTappedAction : ((UITableViewCell) -> Void)? 
  2. 按下仅执行闭合的button时添加一个动作。 你用cell.yes.targetForAction("connected", withSender: self)编程,但我更喜欢@IBAction outlet 🙂

     @IBAction func buttonTap(sender: AnyObject) { tapAction?(self) } 
  3. 现在将func connected(sender: UIButton!) { ... }的内容func connected(sender: UIButton!) { ... }作为一个闭包传递给cell.tapAction = {<closure content here...>} 。 请参阅文章以获取更准确的说明,并且请不要忘记在捕获环境variables时中断参考周期。

简单而简单的方法来检测button事件并执行一些操作

 class youCell: UITableViewCell { var yourobj : (() -> Void)? = nil override func awakeFromNib() { super.awakeFromNib() } @IBAction func btnAction(sender: UIButton) { if let btnAction = self.yourobj { btnAction() } } } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = youtableview.dequeueReusableCellWithIdentifier(identifier) as? youCell cell?.selectionStyle = UITableViewCellSelectionStyle.None cell!. yourobj = { //Do whatever you want to do when the button is tapped here self.view.addSubview(self.someotherView) } return cell } 

作为苹果DOC

targetForAction:withSender:
返回响应动作的目标对象。

您不能使用该方法来设置UIButton目标。
试试addTarget(_:action:forControlEvents :)方法