我在tableview单元格上设置了一个按钮,我想知道如何操作它。也就是说,我有兴趣更改按钮的名称标题,并在单击按钮时添加另一个目标(按钮的不同功能)。我的想法是需要将它添加到buttonClicked func中,但我不确定如何引用被单击的特定cellForRow。或许可以在cellForRow中使用条件来确定按钮标题是什么?我不太清楚最好的办法是什么。
apt purge <package>
答案 0 :(得分:7)
对于Swift 3.2和4.0
查找&#34; indexPath.row
&#34;和&#34; indexPath.section
&#34;
//在&#34; cellForRowAt&#34;
中的按钮上添加目标cell.myBtn.addTarget(self, action: #selector(self.btnAction(_:)), for: .touchUpInside)
//添加功能
func btnAction(_ sender: UIButton) {
let point = sender.convert(CGPoint.zero, to: yourTableView as UIView)
let indexPath: IndexPath! = yourTableView.indexPathForRow(at: point)
print("row is = \(indexPath.row) && section is = \(indexPath.section)")
}
答案 1 :(得分:4)
Chnage并添加您的代码
button.addTarget(self, action:#selector(YourViewController.buttonClicked(_:)), for: .touchUpInside)
button.tag = indexPath.row
func buttonClicked(sender : UIButton!) {
print("Added!")
let row = sender.tag;
print(row)
}
答案 2 :(得分:2)
有两种方法可以做到 - 欺骗的方式或正确的方式。正确的是子类UITableViewCell,在这种情况下,你可以正常方式连接出口。作弊的方法是使用每个元素的标记属性。如果您将按钮的标记设置为(例如)1,则可以使用cell.viewWithTag
中的cellForRowAt
来找到它:如下所示:
let button = cell.viewWithTag(1) as! UIButton
请注意,它会搜索cell
下面的整个层次结构,因此您需要确保没有多个具有相同标记的子视图。
根据您的问题,我猜您要点击按钮并更改其标题。 click处理程序应该只重新加载tableView行(如果你像我一样懒,那么整个表),cellForRowAt
需要知道要显示的标题。每个按钮上显示的内容必须保存在tableView单元格之外,因为在滚动时会重复使用单元格。这意味着一旦顶行滚动屏幕,相同的单元格可能会被重复用于(例如)第20行。 cellForRowAt
中的代码需要完全重置单元格的内容,以防它已被用于另一行。
从您对该问题的评论中添加一些细节,您永远不想避免重复使用单元格,因为这是一件非常好的事情。您可能正在显示一个包含1,000行的表,但在屏幕上只能显示10行。重用单元格意味着iOS可以创建少至10个单元格来显示整个表格,而不是1000。结果表现更快。
答案 3 :(得分:0)
在 Swift 4.x 中,您可以简单地让TableView的委托为其设置标签,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
// Assign tags
cell.myButton.tag = indexPath.row
return cell
}
然后通过右键单击并拖到情节提要中的按钮来连接您的按钮,并将其作为.swift
拖到@IBAction
文件中,选择 Type -> UIButton ,然后单击连接。
代码如下:
@IBAction func myButt(_ sender: UIButton) {
let buttTag = sender.tag // get the Tag of the clicked button in the Cell
// write the code that will be called on click of your button
}