cellView 中的按钮我不知道用户按下了哪个单元格

Posted

技术标签:

【中文标题】cellView 中的按钮我不知道用户按下了哪个单元格【英文标题】:button inside cellView I can't know which cell user pressed 【发布时间】:2016-08-25 09:31:24 【问题描述】:

我在 tableView 中有自定义单元格 在里面我有一个按钮,我想当用户点击按钮时推送 viewController,我该怎么做以及如何知道哪个单元格用户使用它的按钮,因为这里不是didSelectRowAtIndexPath

【问题讨论】:

***.com/questions/19000356/… 的副本 @JJBoursier 我想要这个,你能帮我解释一下吗?我对objective-c一无所知 【参考方案1】:

创建自定义按钮类

class CustomButton: UIButton 
     var indexPath: NSIndexPath!

在您的自定义单元格中创建 CustomButton 类型的按钮,在 cellForRowAtIndexPath 中添加以下行

cell.yourCustomButton.indexPath = indexPath

像这样定义IBAction

@IBAction func customButtonClicked(sender: CustomButton) 
    let indexPath: NSIndexPath = sender.indexPath
    // Do whatever you want with the indexPath

【讨论】:

要访问sender.indexPath,发件人应该是CustomButton类型。 已编辑。谢谢@SamM【参考方案2】:

在单元格中添加按钮标签并为您的转换功能添加目标

func    tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

let cell =     tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as!   CustomCell
cell.button.tag = indexPath.row
cell.button.addTarget(self, action: #selector(    self.transitonMethod    ), forControlEvents: UIControlEvents.TouchUpInside)
return cell


从发送者按钮的标签中获取 indexPath 并为该 indexPath 获取单元格。将控制器推到导航控制器上

func transitonMethod(sender: AnyObject)
 let indexPath = NSIndexPath.init(index: sender.tag)
 let cell = tableView.cellForRowAtIndexPath(indexPath)

self.navigationController?.pushViewController(yourController, animated: true)

【讨论】:

【参考方案3】:

在tableview的cellforRow方法中:

1) 设置按钮的标签,例如yourButton.tag = indexpath.row

2) 设置按钮的目标方法,例如buttonPressed(sender:UIButton)

3) 现在在该目标方法中,您将通过 sender.tag 获得 indexpath.row

【讨论】:

【参考方案4】:

按照ios 7 - How to get the indexPath from button placed in UITableViewCell 中的建议声明如下 IBAction:

@IBAction func didTapOnButton(sender: UIButton) 
    let cell: UITableViewCell = sender.superview as! UITableViewCell
    let indexPath: NSIndexPath = self.tableView.indexPathForCell(cell)
    // Do anything with the indexPath

或者其他方法:

@IBAction func didTapOnButton(sender: UIButton) 
    let center: CGPoint = sender.center
    let rootViewPoint: CGPoint = sender.superview?.convertPoint(center, toView: tableView)
    let indexPath: NSIndexPath = tableView.indexPathForRowAtPoint(rootViewPoint!)
    print(indexPath)

然后使用那个 indexPath 来做任何你需要的事情。

【讨论】:

我在这个 UItableViewCell 类中写了但是我得到了错误,它说“没有成员“tableView” 您必须在包含 TableView 的 ViewController 中声明此方法... 1 - 在您的单元格中放置一个 UIButton,添加约束; 2 - 在包含 TableView 的 ViewController 中声明 IBAction 方法; 3 - 将按钮链接到单元格和单元格控制器内的任何图形(如设置标题); 4 - 将发送的事件链接到您通过情节提要声明 IBAction 的 ViewController; @JJBoursier 你的第一个方法不安全,因为它依赖于 tableViewCell 的架构,而且它也是错误的,因为sender.superview 不会让你得到单元格,它会带你到@987654325 @。要到达单元格,您需要向上走两层,例如 (sender.superview)?.superview 我刚刚将相关帖子翻译成 Swift。

以上是关于cellView 中的按钮我不知道用户按下了哪个单元格的主要内容,如果未能解决你的问题,请参考以下文章

swift 3 在tableView 中按下了哪个单元格按钮

如何知道从另一个视图控制器中的 UICollectionViewController 按下了哪个按钮

检测按下了哪个按钮? (然后行动)

iOS如何识别按下了哪个图像(按钮)?

用户按下了 UIAlertView 上的哪个按钮?

检测按下了哪个按钮