我能够生成UITableView
和UITableViewCell
,但我的操作无法正常运行。我的用例类似于this video
我使用this问题作为参考,并且是不可取的
我错过了什么?有什么东西快速3相关?
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var categories = ["foo", "bar"]
func logAction(sender: UIButton!){
print("HIT BUTTON YO")
}
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.categories.count
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:CustomCell = tableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! CustomCell
cell.label.text = categories[indexPath.row]
let button = cell.button
button?.tag = indexPath.row
button?.addTarget(self, action: #selector(self.logAction), for: .touchUpInside)
return(cell)
}
}
class CustomCell: UITableViewCell {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var label: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
//Configure view for selected state
}
}
答案 0 :(得分:2)
有一种更智能的方法可以处理自定义单元格中的按钮操作。
在自定义单元格中创建一个没有参数/无返回值的回调闭包,并且IBAction
连接到该按钮。在动作中调用回调
class CustomCell: UITableViewCell {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var label: UILabel!
var callback : (()->())?
@IBAction func logAction(_ sender : UIButton) {
callback?()
}
}
在cellForRow
中为回调分配闭包,捕获索引路径。
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! CustomCell
cell.label.text = categories[indexPath.row]
cell.callback = {
print("Button pressed", indexPath)
}
return cell
}
注意:return
不是函数(没有括号)。
答案 1 :(得分:0)
尝试直接访问单元格的按钮。而不是
let button = cell.button
button?.tag = indexPath.row
button?.addTarget(self, action: #selector(self.logAction), for: .touchUpInside)
直接在按钮上设置属性。
cell.button.tag = indexPath.row
cell.button.addTarget(self, action: #selector(self.logAction), for: .touchUpInside)
答案 2 :(得分:0)
是的,所以我只是删除了视图控制器并重新制作并且它现在可以工作¯_(ツ)_ /¯