通过单击UITableView单元格向后传递数据 - iOS / Swift

时间:2017-05-09 17:42:59

标签: ios uitableview swift3 segue

我的应用程序有3个UIViewControllers。 horrible paint 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)
}

4 个答案:

答案 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)

你可以使用闭包,这是一个例子:

ViewController3

class ViewController3: UIViewController {
    var cellSelectedHandler: ((String)->Void)?
    .
    .
    .

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if cellSelectedHandler != nil {
        cellSelectedHandler!("data you want to pass")
    }
 }

ViewController2

class ViewController2: UIViewController {
    //add vc3 as instance variable
    let vc3 =  ViewController3()

ViewController1

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
        }
    }