我有一个UISearchController
,UITableViewController
与searchResultsController
分开。
class SearchResultsViewController: UITableViewController {
var fruits: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView(frame: .zero)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
@objc func addFruit(_ sender: UIButton) {
let point = tableView.convert(sender.bounds.origin, to: sender)
let indexPath = tableView.indexPathForRow(at: point)
print(indexPath?.row)
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return fruits.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = fruits[indexPath.row]
cell.selectionStyle = .none
let addButton = UIButton(type: .custom)
addButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
addButton.setImage(UIImage(named: "add"), for: .normal)
addButton.contentMode = .scaleAspectFit
addButton.addTarget(self, action: #selector(addFruit(_:)), for: .touchUpInside)
addButton.sizeToFit()
cell.accessoryView = addButton
return cell
}
}
我需要在显示搜索结果的单元格中显示自定义按钮。所以我添加了UIButton
作为单元格accessoryView
。它外观和工作正常。
现在,当用户点按此按钮时,我需要获取单元格indexPath
。
我试图让它如下所示。
@objc func addFruit(_ sender: UIButton) {
let point = tableView.convert(sender.bounds.origin, to: sender)
let indexPath = tableView.indexPathForRow(at: point)
}
但它会为每个单元格返回nil
。
还有其他方法可以从自定义按钮点按indexPath
吗?我在这里也添加了demo project。
答案 0 :(得分:1)
创建一个名为SOButton
的自定义类,并为其添加IndexPath
类型的变量。使用此类进行添加按钮初始化。
//Your class will look like -
class SOButton: UIButton {
var indexPath: IndexPath?
}
//Your action will look like -
@objc func addFruit(_ sender: SOButton) {
print(sender?.indexPath.row)
}
//And in your cellForRow add
let addButton = SOButton(type: .custom)
addButton.indexPath = indexPath
希望这可以帮助你:)
答案 1 :(得分:0)
let buttonPosition = sender.convert(CGPoint.zero, to: self.tableView)
let currentIndexPath = self.tableView.indexPathForRow(at: buttonPosition)
试试这个对我有用:)
答案 2 :(得分:0)
我建议使用这个简单的解决方案:将indexPath.row添加到按钮标记:
let addButton = UIButton(type: .custom)
addButton.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
addButton.tag = indexPath.row
按钮操作:
@objc func addFruit(_ sender: UIButton) {
print(sender.tag)
}
答案 3 :(得分:0)
请更新您的代码。你在转换函数中传递UIButton发送者,请将tableView传递给它们
func getIndexPathByCgPoint(_ sender: UIButton) -> IndexPath? {
let point = sender.convert(sender.bounds.origin, to: tableview)
guard let indexPath = tableview.indexPathForRow(at: point) else {
return nil
}
return indexPath
}
但是在节标题的情况下,它返回nil。