确定在 Swift 的自定义 listView 单元格中按下了哪个按钮

Posted

技术标签:

【中文标题】确定在 Swift 的自定义 listView 单元格中按下了哪个按钮【英文标题】:Identifying which button pressed in a custom listView cell in Swift 【发布时间】:2014-09-01 19:03:27 【问题描述】:

我在 Swift 中为 listView 创建了一个自定义单元格。它上面有两个按钮——一个是“暂停”按钮,一个是“停止”按钮。这个想法是每个行项目代表一个下载,因此用户可以独立地停止和启动每个项目。

但是,我需要为每个按钮创建一个@IBAction。我已经在主 ViewController 中创建了这些,果然,当它们连接起来时,它们会适当地触发。

我坚持的一点是识别按下了哪一行按钮的标识符。我假设与 cellForRowAtIndexPath 相关的东西会起作用。

我找到了以下代码(我从有关文本字段的类似问题中找到):

@IBAction func startOrPauseDownloadSingleFile(sender: UIButton!) 
    let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
    let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)

但是,我不断收到错误消息“无法使用类型为 (@lvalue CGPoint, toView: $T6) 的参数列表调用 'convertPoint'”。

谁能帮忙?

谢谢,

【问题讨论】:

【参考方案1】:

我把你的代码嵌入到一个简单的项目中。

在 Interface Builder 中,我创建了一个 UITableViewController 场景并将其类设置为“ViewController”。我向它添加了一个UITableViewCell,将其标识符设置为“Cell”,将其样式设置为“Custom”,并将其类设置为“CustomCell”。然后我在单元格的 contentView 中添加了一个 UIButton 并为其设置了明确的自动布局约束。

在 Project Navigator 中,我创建了一个名为“ViewController”的新文件,并在其中添加了以下代码:

import UIKit

class CustomCell: UITableViewCell 

    @IBOutlet weak var button: UIButton!

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    override init(style: UITableViewCellStyle, reuseIdentifier: String!) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    

    override func awakeFromNib() 
        super.awakeFromNib()
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)
    



class ViewController: UITableViewController 

    func buttonPressed(sender: AnyObject) 
        let pointInTable: CGPoint = sender.convertPoint(sender.bounds.origin, toView: self.tableView)
        let cellIndexPath = self.tableView.indexPathForRowAtPoint(pointInTable)
        println(cellIndexPath)
    

    override func awakeFromNib() 
        super.awakeFromNib()
    

    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 10
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
        cell.selectionStyle = .None

        cell.button.addTarget(self, action: "buttonPressed:", forControlEvents: UIControlEvents.TouchUpInside)

        return cell
    


我终于在 Interface Builder 中将按钮的 IBOutlet 链接到 UIButton,运行项目并能够记录每次按钮触摸时相应单元格的 indexPaths。

【讨论】:

我遵循了你的计划,一切正常。但是我尝试在单个单元格中添加更多 UI 项目并且它再次起作用但是当我滚动并且一个单元格从视图中退出并且当它返回时似乎不记得约束并且我将所有按钮都放在 0,0 坐标的细胞。如何解决这个问题?

以上是关于确定在 Swift 的自定义 listView 单元格中按下了哪个按钮的主要内容,如果未能解决你的问题,请参考以下文章

不使用 Storyboard segues 的自定义视图转换 (Swift)

ListView 中的自定义复选框

Swift 代表在 2 个地方设置单例

如何在颤动中创建这样的自定义 ListView 项目?

TextView 在 ListView 内的自定义 ArrayAdapter 中被切断

ListView 的自定义适配器忽略设置值