将indexpath标签传递给tableview原型单元格内的按钮

Posted

技术标签:

【中文标题】将indexpath标签传递给tableview原型单元格内的按钮【英文标题】:Passing indexpath tag to button inside prototype cell in tableview 【发布时间】:2016-09-28 11:01:01 【问题描述】:

我在情节提要中创建了一个 tableview 原型单元格,并向单元格添加了一个按钮并将其标记设置为 indexpath.row。当我滚动我的单元格时,tableview 顶部的滚动单元格总是将标签设置为零而不是正确的标签。

public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("autoLoadReuseIndentifier", forIndexPath: indexPath)

        print("indexpath :\(indexPath.row)")


        cell.contentView.viewWithTag(100)?.layer.cornerRadius = 5
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        let tempDict : NSDictionary = savedCardsArray.objectAtIndex(indexPath.row) as! NSDictionary


        let bankName = cell.contentView.viewWithTag(102) as! UILabel

        deleteButton = cell.contentView.viewWithTag(106) as? UIButton
        deleteButton?.tag = indexPath.row
        deleteButton?.addTarget(self, action: "deleteCard1:", forControlEvents: UIControlEvents.TouchUpInside)
        print("delete button:\(deleteButton)")
       // print("indexpath delete tag :\(deleteButton.tag)")
        if(self.isSetUpAutoloadSelected)
            deleteButton?.hidden = true
        else
            deleteButton?.hidden = false
        
        return cell;
    

每当我滚动单元格时,删除按钮标签总是设置为零。

【问题讨论】:

哪个视图有标签 100、102 和 106。请为每个视图命名。 显示print("delete button:\(deleteButton)")的日志 在我之后重复“不要使用标签。它们很脆弱。它们会给我带来比它们解决的问题更多的问题”。使用具有属性的正确UITableViewCell 子类来引用您的视图。使用协议和委托将按钮事件从单元格返回到您的视图控制器。让单元格将自身传递给委托,以便视图控制器可以识别行 @Paulw11 是对的,顺便说一句,您是否创建了自定义 UITableViewCell 类并将其分配给单元格? 请参阅***.com/questions/28659845/…,了解使用从单元格到视图控制器的协议的示例。该问题的另一个答案显示了如何使用闭包,这是另一种好方法 【参考方案1】:

如果您应该使用其他方式,请使用跟随代码并获取 indexPath。

func deleteCard1(_ sender:deleteCard) 
     let buttonPosition:CGPoint = sender.convert(CGPointZero, to:self.tableView)
     let indexPath = self.tableView.indexPathForRow(at: buttonPosition)
 

【讨论】:

【参考方案2】:

    我认为您不需要遵循这种方法,因为首先您在情节提要中静态设置按钮标签,然后再次在 cellforrowatindexpath 中更改它的标签,因此当您滚动时,单元格将永远找不到标签为 106 的按钮。如果如果您想遵循这种方法,那么您需要创建 customButton 并添加 NSInteger 类型的变量或任何您想要的变量,并将 indexpath.row 存储到 customButton 的该变量中。

    另一种方法是创建 CustomTableViewCell 类并在此自定义 Cell 类中创建按钮插座,并将 indexpath.row 设置为按钮标签,如下所示

    CustomCellClassObject.buttonName.tag = indexPath.row

【讨论】:

【参考方案3】:

正如 Sumit 所说,最好使用自定义单元格并为按钮和标签创建插座,因为使用标签获取子视图将很难在将来维护代码。

此外,您不必创建变量 deleteButton,因为我没有看到有效的用途。

为按钮分配标签并在 cellForRowAtIndexPath 中添加目标,它应该可以正常工作。

【讨论】:

以上是关于将indexpath标签传递给tableview原型单元格内的按钮的主要内容,如果未能解决你的问题,请参考以下文章

不能将值传递给另一个 viewController?

IndexPath.row 多个部分的错误值

仅当 indexPath 对象可用时,如何在 tableview 单元格上使用标签

无法将 autoID 传递给新的 VC

Segue 不传递正确的行的索引路径总是第 0 节

将单元格从委托传递到 UITableViewController 时 indexPath 为零