将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原型单元格内的按钮的主要内容,如果未能解决你的问题,请参考以下文章