我的应用程序有3个UIViewControllers。 ViewController#1 - >#2是“show segue”,#2 - >#3是“按模态存在”。 #3有一个UITableView。单击一个单元格时,我想跳回到#1并从#3传递数据。 我设法解雇#3并使用此功能返回#2,但这不是我需要的。请指教。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
self.dismiss(animated: true, completion: {
self.funcToCall(id: id)
}
答案 0 :(得分:3)
您必须使用委托将值传递给vc#1并弹出到根视图控制器。
答案 1 :(得分:0)
您应该能够通过定义在点击UITableViewCell时触发的另一个segue来实现所需的结果。确保为其分配标识符。将以下代码添加到UITableView控制器
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Segue Identifier Here" {
var dest = segue.destinationViewController as! DestViewController
dest.dataObj = dataToBePassed
}
答案 2 :(得分:0)
尝试通过NSNotificationCenter
注册以接收VC1的ViewDidLoad
中的通知 NotificationCenter.default.addObserver(self, selector: #selector(self.myData(_:)), name: NSNotification.Name(rawValue: "notificationName"), object: nil)
// handle notification
func myData(_ notification: NSNotification) {
let object = notification.object // You data
}
在VC3中发布此通知
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: **yourData**)
// Do popToRootViewContoller
答案 3 :(得分:0)
你可以使用闭包,这是一个例子:
class ViewController3: UIViewController {
var cellSelectedHandler: ((String)->Void)?
.
.
.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if cellSelectedHandler != nil {
cellSelectedHandler!("data you want to pass")
}
}
class ViewController2: UIViewController {
//add vc3 as instance variable
let vc3 = ViewController3()
class ViewController: UIViewController {
func presentViewController2() {
let vc2 = ViewController2()
vc2.vc3.cellSelectedHandler = {(dataPassed) in
vc2.vc3.dismiss(animated: true, completion: nil)
_ = vc2.navigationController?.popViewController(animated: true)
//use dataPassed
}
}