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 中有一个表格视图,我确实将它 delegate 和 dataSource 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 中删除了事件
注意:由于 delegate
和 dataSource
的 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