双击 UITableview 中的单元格以执行 segue
Posted
技术标签:
【中文标题】双击 UITableview 中的单元格以执行 segue【英文标题】:Double tap on cell in UITableview to perform segue 【发布时间】:2018-11-20 05:10:30 【问题描述】:我试图让用户在点击单元格时转到另一个视图控制器。目前,我通过将故事板中的控件拖动到我的视图控制器,然后为prepare(for segue...)
传递以下代码来设置我的单元格。基本上,有我的保护声明确认我有正确的视图控制器,然后我在它们之间传递一个对象。
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "")
case "ShowEventDetailsSegue":
guard let navVC = segue.destination as? UINavigationController else
fatalError("Unexpected destination: \(segue.destination)")
guard let EventDetailViewController = navVC.viewControllers.first as? EventViewController else
fatalError("Unexpected navigation view controller: \(String(describing: navVC.viewControllers.first))")
guard let selectedEventCell = sender as? EventTableViewCell else
fatalError("Unexpected sender: \(String(describing: sender))")
guard let indexPath = tableView.indexPath(for: selectedEventCell) else
fatalError("The selected cell is not being displayed by the table")
let selectedEvent = events[indexPath.section]
EventDetailViewController.event = selectedEvent
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
我知道其他人建议调用类似
DispatchQueue.main.async
self.present(myVC, animated: true, completion: nil)
(见here和also here)
但是当我这样做时,我收到一个错误“由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'应用程序试图以模态方式呈现一个活动控制器”。
基本上,我希望用户只在单元格上单击一次,并且仍然能够将数据传递给另一个视图控制器。
同样奇怪的是,这才刚刚开始。在今天之前我没有这个问题。
【问题讨论】:
你在哪里添加了这个代码self.present(myVC, animated: true, completion: nil)
?
您需要在代码中触发 segue,或者在情节提要中设置它。你可能两者都做,因此例外。
@Amit 我在我的 gaurd 语句下方添加了代码,就在默认值之前。由于没有更好的术语,我已经通过“点击单元格”来触发 segue。 @Evgeniy 我同意。我目前在故事板中设置它,然后在我的prepare( for segue...)
方法中处理逻辑。如果可能的话,我想这样处理。
@Evgeniy 这两种方法我都试过了,我仍然需要点击两次才能使单元格继续
【参考方案1】:
所以你正在做的是:
在 tableView
didSelectRowAt
您正在添加的方法中:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
触发delegate
方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
已经有一个控制器准备打开,而您正在以编程方式呈现一个不同的控制器,这显然会引发错误。
您可以编写不同的逻辑以在tableView
didSelectRowAt
中以编程方式呈现视图,或者您可以在第二个视图控制器viewDidLoad
方法中移动整个代码。
【讨论】:
有点。基本上,我相信我需要切换我的代码,但我仍然想prepare
进行转场,因为我需要将数据传递给接收控制器。【参考方案2】:
原来,我的单元格的选择样式设置为无。
cell.selectionStyle = UITableViewCellSelectionStyle.none
我不想要选择样式,所以解决这个问题的方法是进行异步调用
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
DispatchQueue.main.async
self.performSegue(withIdentifier: "ShowEventDetailsSegue", sender: nil)
这现在解决了这个问题。欲了解更多信息,请查看this post.
【讨论】:
以上是关于双击 UITableview 中的单元格以执行 segue的主要内容,如果未能解决你的问题,请参考以下文章
导出到excel时如何取消合并s-s-rs中的单元格以尝试排序