当点击表视图中的元素时,如何转到另一个视图控制器?

How to go to another View Controller when an element inside table view is being tapped?(当点击表视图中的元素时,如何转到另一个视图控制器?)
本文介绍了当点击表视图中的元素时,如何转到另一个视图控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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")
    }
}

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

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
iOS VoiceOver functionality changes with Bundle Identifier(IOS画外音功能随捆绑包标识符而变化)
tabbar middle tab out of tabbar corner(选项卡栏中间的选项卡角外)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
How can I sync two flatList scroll position in react native(如何在本机Reaction中同步两个平面列表滚动位置)