回调关闭函数在单元格中不起作用
Callback closure function not working in cell
我有一个 table 视图单元格,其中包含一个用于显示警报 sheet 的特定按钮。
我了解到无法在 table 视图单元格内按下按钮本身。它必须从视图控制器调用。
所以我像这样添加了一个回调闭包:
class FeedViewCell: UITableViewCell {
var callback : (() -> ())?
static let reuseIdentifier: String = "FeedTableViewCell"
lazy var menuButton: UIButton = {
let btn = UIButton()
btn.isUserInteractionEnabled = true
btn.addTarget(self, action: #selector(menuTapped), for: .touchUpInside)
return btn
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addSubview(menuButton)
}
@objc func menuTapped() {
print("menu tapped")
callback?()
}
我怀疑这可能是 table 查看单元格注册的问题。如果不是,请告诉我。在视图控制器中我这样做了:
class FeedViewController: UIViewController {
// some code...
tableView.register(FeedViewCell.self, forCellReuseIdentifier: FeedViewCell.reuseIdentifier)
}
extension FeedViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: FeedViewCell.reuseIdentifier, for: indexPath) as! FeedViewCell
cell.callback = {
print("menu")
let actionSheet = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { action in
print("tap dismiss")
}))
actionSheet.addAction(UIAlertAction(title: "Follow", style: .default, handler: { action in
print("tap follow")
}))
self.present(actionSheet, animated: true, completion: nil)
}
return cell
}
}
所以主要问题是,为什么按钮不起作用?它甚至不打印“菜单”
谢谢大家的回答
这一行是错误的。
addSubview(menuButton)
改为:
contentView.addSubview(menuButton)
尝试像这样将按钮添加到单元格的内容视图中:
self.contentView.addSubview(self.menuButton)
我有一个 table 视图单元格,其中包含一个用于显示警报 sheet 的特定按钮。 我了解到无法在 table 视图单元格内按下按钮本身。它必须从视图控制器调用。 所以我像这样添加了一个回调闭包:
class FeedViewCell: UITableViewCell {
var callback : (() -> ())?
static let reuseIdentifier: String = "FeedTableViewCell"
lazy var menuButton: UIButton = {
let btn = UIButton()
btn.isUserInteractionEnabled = true
btn.addTarget(self, action: #selector(menuTapped), for: .touchUpInside)
return btn
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addSubview(menuButton)
}
@objc func menuTapped() {
print("menu tapped")
callback?()
}
我怀疑这可能是 table 查看单元格注册的问题。如果不是,请告诉我。在视图控制器中我这样做了:
class FeedViewController: UIViewController {
// some code...
tableView.register(FeedViewCell.self, forCellReuseIdentifier: FeedViewCell.reuseIdentifier)
}
extension FeedViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: FeedViewCell.reuseIdentifier, for: indexPath) as! FeedViewCell
cell.callback = {
print("menu")
let actionSheet = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { action in
print("tap dismiss")
}))
actionSheet.addAction(UIAlertAction(title: "Follow", style: .default, handler: { action in
print("tap follow")
}))
self.present(actionSheet, animated: true, completion: nil)
}
return cell
}
}
所以主要问题是,为什么按钮不起作用?它甚至不打印“菜单”
谢谢大家的回答
这一行是错误的。
addSubview(menuButton)
改为:
contentView.addSubview(menuButton)
尝试像这样将按钮添加到单元格的内容视图中:
self.contentView.addSubview(self.menuButton)