当点击表视图中的元素时,如何转到另一个视图控制器? [英] How to go to another View Controller when an element inside table view is being tapped?

查看:45
本文介绍了当点击表视图中的元素时,如何转到另一个视图控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在TableViewCell中有一个UIView,当用户点击此UIView时,它会转到另一个视图控制器并传递数据。

因此在TableViewCellClass中我执行了以下操作:

我设置了一个协议,并在用户打开UIView时检测到"Tap"手势。此部分工作正常:

protocol MyDelegate : class {
        func runThisFunction(myString : String)
}

class MyTableViewCell: UITableViewCell {

        weak var delegate : MyDelegate?

        ...other code here

        //here detect the tap 
        let tap = UITapGestureRecognizer(target: self, action: #selector(hereTapped))
        self.myUIElementInThisCell.addGestureRecognizer(tap)

}

@objc func hereTapped(sender: UITapGestureRecognizer? = nil){
    self.delegate?.runThisFunction(myString: "I am a man")
}

因此,在包含此TableView的视图控制器中,我执行了以下操作:

我扩展了MyDelegateAS子类,然后在里面附加了协议函数,如下所示

class MyViewController: UIViewController,MyDelagate{

func runThisFunction(myString : String) {
     print("Tapped in view controller")
    self.performSegue(withIdentifier: "MySegue",sender : self)
}

 override func viewDidLoad() {
    super.viewDidLoad()

    let tableViewCell = MyTableViewCell()
    tableViewCell.delegate = self
 }
}

结果:

完成上述所有操作后,当我点击UIView时,它没有执行MyViewControllerClass中所述的段,甚至print()命令也没有执行。

那么我错过了什么?请给我一个解决方案。谢谢

推荐答案

您的viewDidLoad中有问题:

// you create a new cell
let tableViewCell = MyTableViewCell()
// set its delegate
tableViewCell.delegate = self
// and then the cell is not used for anything else

基本上,您不是为正在显示的单元格设置委托,而是为您在viewDidLoad中创建的另一个实例设置委托。

您必须在cellForRowAt中设置委托,以确保正确的单元格获得delegate集合:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourIdentifier", for: indexPath) as! MyTableViewCell
    cell.delegate = self
    return cell
}

这将为显示的那些单元格设置delegate


或者,我建议使用UITableViewDelegate中的didSelectRowAt(如果您的MyViewController实现了它):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.row == 0 { // only if it is the first cell (I assume that MyTableViewCell is first)
        runThisFunction(myString: "I am a man")
    }
}

这篇关于当点击表视图中的元素时,如何转到另一个视图控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆