问题描述
我有一个模态呈现的 ViewController
,里面有一个 UITableView
。当用户单击“Days”时,它会显示此视图控制器(模态)。这是我的故事板:
我想要做的是,当我在模态中单击表格视图中的单元格之一时,我想关闭模态,但还要在根视图控制器中加载新数据。
我怎样才能从 segued 视图控制器访问根视图控制器?
func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
self.dismiss(animated: true,completion: nil)
}
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
let destinationVC = segue.destination as! DayView
if let indexPath = tableView.indexPathForSelectedRow {
destinationVC.day = days![indexPath.row]
}
}
我想要一些类似于我上面写的东西,但是虽然我的模态确实被解除了,但我想要的是在点击 TableViewCell 时以某种方式触发准备函数中的代码。
解决方法
比协议/委托更短更简单的方法是创建一个闭包:
为了返回一个字符串,在第一个 ViewController 中:
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
if let viewControllerB = segue.destination as? ViewControllerB {
viewControllerB.callback = { message in
//Do what you want in here!
}
}
}
在 ViewControllerB 中:
var callback : ((String) -> Void)?
func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
callback?("Your Data")
self.dismiss(animated: true,completion: nil)
}
,
您在正确的道路上,您需要再添加两个函数 1. unwindsegue
和一个 this 不是目标其源,因此您需要从目标更改为源。
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
let destinationVC = segue.source as! DayView
if let indexPath = tableView.indexPathForSelectedRow {
destinationVC.day = days![indexPath.row]
}
}