“自上而下” UITableView 中的 UITableViewCell 中的多个按钮

Posted

技术标签:

【中文标题】“自上而下” UITableView 中的 UITableViewCell 中的多个按钮【英文标题】:Multiple buttons in UITableViewCell in a 'top-down' UITableView 【发布时间】:2017-07-10 14:48:11 【问题描述】:

我正在尝试解决当表格视图“自上而下”时如何在 UITableViewCell 中操作按钮 - 例如,每个新行都添加到表格视图的顶部。我通过以下代码实现了这一点:

我使用以下代码将新项目插入到我的模型数组中,然后插入到 tableview 中:

let newItem = Item(text: inputTextView.text, time: Date())
items.insert(newItem, at: 0) //inserting into the front of model array

tableView.beginUpdates()
let indexPath:IndexPath = IndexPath(row:0, section:0)
tableView.insertRows(at: [indexPath], with: .fade)
tableView.endUpdates()

在 cellForRowAt 函数中,我运行以下代码:

let cell = tableView.dequeueReusableCell(withIdentifier: postCellID, for: indexPath) as! NewPostCell
let item = items[indexPath.row]

cell.postTextLabel.text = text
cell.timeLabel.text = dateFormatter.string(from: time)

cell.selectionStyle = .none

return cell

我的每个 tableview 单元格中都有三个按钮。

如何连接这些按钮,以便知道从哪个 indexPath 按下了哪个按钮?

问题是,如果我使用 indexPath.row 来标记按钮,那么所有单元格中的按钮都会被标记为 0,因为每个插入都发生在 indexPath.row 第 0 位的表格顶部。

我想用我的模型数组的当前大小来标记按钮,但这也不起作用,因为当重新使用单元格时,它们可以在那时用数组的长度进行标记,这将是错了。

有很多应用程序在表格视图类型的设置中具有“顶部的最后一个条目”,并且在单元格中带有按钮。所以一定有办法做到这一点。

【问题讨论】:

除了其他答案之外,您还可以使用委托传递单元格,然后将单元格的位置转换为 indexPath。这样就不需要标签 【参考方案1】:

您可以将UIButton 添加到您的UITableViewCell 并通过标签访问这些UIButton 并将目标方法添加到这些按钮:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        // create a new cell if needed or reuse an old one
        let cell:UITableViewCell = self.tableVw.dequeueReusableCell(withIdentifier: "Cell") as UITableViewCell!

        //Access UIButton
        let button1:UIButton = cell.viewWithTag(10) as! UIButton
        let button2:UIButton = cell.viewWithTag(11) as! UIButton
        let button3:UIButton = cell.viewWithTag(12) as! UIButton

        //Add Action Methods to UIButtons
        button1.addTarget(self, action: #selector(FisrtButtonClick), for: .touchUpInside)
        button2.addTarget(self, action: #selector(SecondButtonClick), for: .touchUpInside)
        button3.addTarget(self, action: #selector(ThirdButtonClick), for: .touchUpInside)

        return cell
    

按钮操作

// MARK: - UIButton Methods.
    func FisrtButtonClick(_ sender: Any)  
        //Get Button cell position.
        let ButtonPosition = (sender as AnyObject).convert(CGPoint.zero, to: tableVw)
        let indexPath = tableVw.indexPathForRow(at: ButtonPosition)
        if indexPath != nil 
            print("Cell indexPath: \(indexPath?.row)")
        
    

    func SecondButtonClick(_ sender: Any)  

        //Get Button cell position.
        let ButtonPosition = (sender as AnyObject).convert(CGPoint.zero, to: tableVw)
        let indexPath = tableVw.indexPathForRow(at: ButtonPosition)
        if indexPath != nil 
            print("Cell indexPath: \(indexPath?.row)")
        

    

    func ThirdButtonClick(_ sender: Any)  

        //Get Button cell position.
        let ButtonPosition = (sender as AnyObject).convert(CGPoint.zero, to: tableVw)
        let indexPath = tableVw.indexPathForRow(at: ButtonPosition)
        if indexPath != nil 
            print("Cell indexPath: \(indexPath?.row)")
        

    

【讨论】:

抱歉回复晚了,正忙于其他事情。这看起来是个不错的选择,我会试一试。还将尝试@JMM 概述的方法,看看哪种方法效果更好。 选择这个作为正确答案,因为它似乎是解决这个问题的最干净和最有效的方法。感谢您的帮助。 当我们有 UIButtons 计数时它可以工作,但是我们可以在 tableViewCell 中创建动态 UIButtons(基于数据模型)吗?【参考方案2】:

主要思想

这些是您必须执行的基本步骤:

    为 3 种按钮类型中的每一种设置唯一的 tag:这将允许识别单元格的 3 个按钮中的哪一个被按下。 (例如tag 第一个按钮的值为 1,第二个按钮的值为 2,第三个按钮的值为 3)。

    将 3 个按钮链接到 @IBAction 方法。 您也可以使用目标操作以编程方式执行此操作:为每个按钮调用 aButton.addTarget(target:, action:, for:)

然后当一个按钮被按下时,你将使用一个辅助函数来确定被按下按钮的单元格索引。


代码

@IBAction 方法应类似于 @IBAction func buttonTrigerred(_ sender: UIButton)...,代码为:

@IBAction func buttonTrigerred(_ sender: UIButton)
    // -- retrieving the index path of the cell, as @NikhleshBagdiya posted
    // Determine the indexPath of the cell
    let buttonPosition = (sender as AnyObject).convert(CGPoint.zero, to: tableView)
    let cellIndexPath = tableView.indexPathForRow(at: buttonPosition)
    // --

    // Determine which button is called
    if sender.tag == 1  ...       // the first kind of button has been pressed
    else if sender.tag == 2  ...  // second button kind
    else if sender.tag == 3  ...  // third  button kind

设置tag

我的每个 tableview 单元格中都有三个按钮。

我想你已经在 Storyboard 或 Xib 文件中设计了你的 UITableViewCell。因此,对于单元格的 3 个按钮中的每一个:选择按钮,转到属性检查器,将 tag 设置为上述自定义值。

【讨论】:

抱歉回复晚了,正忙于其他事情。这看起来是解决这个问题的可行方法,但我觉得它有点“hacky”。解决这个用例可能需要一个稍微复杂的解决方案。将与@Nikhlesh Bagdiya 在下一篇文章中的建议一起尝试。将尝试两者,看看什么效果最好。谢谢。

以上是关于“自上而下” UITableView 中的 UITableViewCell 中的多个按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何减少/删除分组 UITableView 中的左/右手边距?

触摸事件未在 UITableView 上触发

iOS:重新加载 UITableView 后滑动显示数据

用部分动态填充分组的 uitableView

将 UIButton 放入 UITableView

iOS Storyboard约束详解