我创建了一个包含按钮的自定义单元格,我需要从该按钮创建segue到其他VC,但是首先,我想使用该segue推送对象。
我已经尝试使用cell.button.tag,但是没有成功。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showMap" {
let mapVC = segue.destination as! MapViewController
//guard let indexPath = tableView.indexPathForSelectedRow else { return }
mapVC.place = places[] // <- "here I need index of button in cell"
}
}
答案 0 :(得分:1)
通过segue
中的 navigation
以编程方式处理closure
,而不是使用UITableViewCell
。
class CustomCell: UITableViewCell {
var buttonTapHandler: (()->())?
@IBAction func onTapButton(_ sender: UIButton) {
self.buttonTapHandler?()
}
}
在上面的代码中,我创建了一个buttonTapHandler
-一个closure
,只要在button
内部的cell
被点击时就会调用它。
现在,在cellForRowAt
方法中,当您dequeue
设置单元格时,请设置buttonTapHandler
中的CustomCell
。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
cell.buttonTapHandler = {[weak self] in
if let mapVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MapViewController") as? MapViewController {
mapVC.place = places[indexPath.row]
self?.navigationController?.pushViewController(mapVC, animated: true)
}
}
return cell
}
在上面的代码中,buttonTapHandler
被调用时将push
MapViewController
的新实例以及基于place
的相关indexPath
。
答案 1 :(得分:0)
如果您不想在didSelectRowAt方法中执行代码,我认为另一种不错的方法是创建自定义单元格的委托。参见下面的代码
// This is my custom cell class
class MyCustomCell: UITableViewCell {
// The button inside your cell
@IBOutlet weak var actionButton: UIButton!
var delegate: MyCustomCellDelegate?
@IBAction func myDelegateAction(_ sender: UIButton) {
delegate?.myCustomAction(sender: sender, index: sender.tag)
}
// Here you can set the tag value of the button to know
// which button was tapped
func configure(index: IndexPath){
actionButton.tag = index.row
}
}
protocol MyCustomCellDelegate {
func myDelegateAction(sender: UIButton, index: Int)
}
在使用自定义单元的位置委托ViewController。
class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as! MyCustomCell
cell.configure(index: indexPath)
cell.delegate = self
return cell
}
}
最后,自定义方法以扩展自定义单元格委托
extension MyViewController: MyCustomCellDelegate {
func myDelegateAction(sender: UIButton, index: Int) {
// Do your staff here
}
}
我希望我能帮上忙。
答案 2 :(得分:0)
在自定义单元格中:
import UIKit
protocol CustomCellDelegate: class {
func btnPressed(of cell: CustomCell?)
}
class CustomCell: UITableViewCell {
weak var delegate: CustomCellDelegate?
@IBAction func btnTapped(_ sender: UIButton) {
delegate?.btnPressed(of: self)
}
}
在视图控制器中:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: CustomCell = tableView.dequeueReusableCell(for: indexPath)
cell.delegate = self
return cell
}
extension ViewController: CustomCellDelegate {
func btnPressed(of cell: CustomCell?) {
if let cell = cell, let indexPath = tableView.indexPath(for: cell) {
// Your stuff here
}
}
}