didSelectRowAt Swift 3 即使在设置了委托和数据源后也没有调用

Posted

技术标签:

【中文标题】didSelectRowAt Swift 3 即使在设置了委托和数据源后也没有调用【英文标题】:didSelectRowAt Swift 3 Not Called even after delegate and dataSource are set 【发布时间】:2017-01-28 17:54:06 【问题描述】:

这个问题似乎已经在 *** 上被问过很多次了,但是搜索了几个小时后,我仍然没有找到解决我的问题的方法。

我在 SecondViewController.swift 中有一个表格视图,我确实将它 delegatedataSource SecondViewController.swift >,但是当单击表格单元格时,仍然不会触发 didSelectRowAt 方法。我正在尝试将 segue 应用于另一个视图控制器,但 didSelectRowAt 方法本身不起作用。

我在我的故事板中的表格视图属性中选择了单选,并确保为表格视图和原型单元格启用了用户交互

对于下面的 SecondViewController.swift,请假设 allEvents 填充到 allEvents 数组中。我能够成功填充它们并将它们显示在表格中。唯一的问题是单击该行以执行转场。另外,请忽略下面尴尬的缩进。

SecondViewController.swift

import UIKit

class SecondViewController: UIViewController, UITableViewDataSource,    UITableViewDelegate 

  @IBOutlet var tableView: UITableView!

  var allEvents: Array<JSON> = []

  override func viewDidLoad() 

    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    //self.tabBarItem.image = myTabImage
    self.tabBarController?.tabBar.isTranslucent = false
    self.tabBarController?.tabBar.barTintColor = UIColor(red:0.25, green:0.25, blue:0.25, alpha:1.0)
    self.tabBarController?.tabBar.tintColor = UIColor.white

    //ASSUME ALL EVENTS ARE POPULATED INTO allEvents

  

override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.



// MARK: Tableview Datasource
func numberOfSections(in tableView: UITableView) -> Int 
    return 1


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return allEvents.count


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 

    return 150


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("SEGUE")
    self.performSegue(withIdentifier: "oneSegue", sender: allEvents[indexPath.row])


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "eventViewTableCell", for: indexPath) as! EventViewTableCell        

    return cell


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
   // let detailController = segue.destination as! EventDetailsController




我已经研究了几个小时,但仍然没有发现问题。我将非常感谢任何帮助!

【问题讨论】:

“SEGUE”是否在控制台窗口中打印出来? 它不在控制台窗口中打印。 我真的没有在您的代码中看到任何表明此类问题的内容。检查您的 tableView 的框架 - 确保您没有任何其他透明视图堆叠在顶部,这会阻止在 tableView 上处理触摸事件。 不要忘记在 Interface Builder 中将表视图设置为数据源和委托,如下所示:***.com/a/41350632/5327882 在我的故事板中,tableView 里面有原型单元格,原型单元格里面有一个 contentView。 contentView 默认带有原型单元格。此外,数据源和委托已经在 Interface Builder 中设置。 【参考方案1】:

您可能想再次检查您的表格视图,请选择单选。

我假设您选择 No Selection 作为下面的图片

希望对你有帮助。

【讨论】:

是的,我已经选择了原帖中提到的单选,但它仍然不起作用。 如何为视图启用用户交互? 是的,我也这样做了,正如我原来的帖子中提到的那样,但仍然不起作用...... 这个是给我的。谢谢【参考方案2】:

我在 TabBarController 中的控制器上遇到了同样的问题。

为我解决的问题是:

禁用内容视图

的用户交互

我的猜测是它正在成为响应者,因此它从 TableView 中删除了事件

注意:由于 delegatedataSource 的 viewDidLoad 分配在 StoryBoard 中设置后变得多余,因此我删除了它们,尽管留下它们并没有什么坏处。

【讨论】:

【参考方案3】:

如果您只是在didSelectRowAt 中调用segue,则删除整个方法并将Interface Builder 中的segue 连接到表格视图单元格(而不是控制器)。 sender 参数将包含对选定表格视图单元格的引用。

【讨论】:

【参考方案4】:

我怀疑当您收集并填充您的 allEvents 数组时,您是否在其中收集了任何触摸事件? 或者你在这个或它的超级视图中使用过 UIGestureRecognizer 吗? 如果您拦截了任何触摸事件以填充您的数组或任何其他目的,请将其注释掉并使用简单的预加载数组进行测试,例如:

let dataSource = ["1", "2", "3", "4"]

如果这不是您的情况,请告诉我,以便我找到其他解决方案。

【讨论】:

以上是关于didSelectRowAt Swift 3 即使在设置了委托和数据源后也没有调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 中的“didSelectRowAt indexPath”问题

Swift 4:没有调用 didSelectRowAt 委托

Swift 中 didSelectRowAt 函数上的 Switch 语句

Swift UITableView 仅在我按下几秒钟时调用 didSelectRowAt

Swift - didSelectRowAt indexPath 下一个 VC 没有出现/没有故事板/

如何在 swift 中从情节提要中的 didSelectRowAt indexPath 打开视图标签栏控制器?