【问题标题】:Cannot transfer data using segue programmatically - swift3无法以编程方式使用 segue 传输数据 - swift3
【发布时间】:2018-04-05 15:25:54
【问题描述】:

我正在尝试从 navigationController 中弹出 ViewController 并使用 segue 以编程方式发送数据。我似乎无法成功地将数据传输到我的目标 viewController。下面是我的代码。请问有人可以告诉我哪里出错了吗?

我正在尝试将目标 viewController 中的变量“segueContainerNewFolderCreatedBool”分配为“true”。但是当目标视图控制器加载时,在 viewWillAppear() 中,“segueContainerNewFolderCreatedBool”的值始终为“假”。我没有想法。

目标视图控制器:

 class menuTableViewController: UITableViewController{
 ...
   var segueContainerNewFolderCreatedBool = false

   override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(true)

      print("self.segueContainerNewFolderCreatedBool : \(self.segueContainerNewFolderCreatedBool)")

   }     ...
 }

源视图控制器:

  let task = session.dataTask(with: request, completionHandler: { (data, response, error) in

            if let jsonData = data{

                do{
                    let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: [])

                    guard
                        let jsonDictionary = jsonObject as? [String:String],
                        let message = jsonDictionary["msg"] else{
                            print("unexpected data structure from server")
                            return
                    }

                    if(message == "folder created success"){
                        // Folder created success
                        print("folder created success")


                        // Generate segue to tansfer data - let 'menuTableViewController' know that new
                        // folder has been created - to update tableView of user folders
                        let storyBoard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
                        let destinationViewController = storyBoard.instantiateViewController(withIdentifier: "landingPage") as! menuTableViewController
                        let sourceViewController = storyBoard.instantiateViewController(withIdentifier: "createUserFolder") as! CreateNewUserFolderPubMed

                        let segue = UIStoryboardSegue.init(identifier: "nFolderSegue", source: sourceViewController, destination: destinationViewController, performHandler: {

                            DispatchQueue.main.async{

                                destinationViewController.segueContainerNewFolderCreatedBool = true

                                if let navController = self.navigationController{
                                    navController.popViewController(animated: true)
                                }
                            }// End DispatchQueue

                        })
                        segue.perform()


                    }else{
                        // Folder created fail
                    }
                }catch let error{
                    print("error detail: \(error)")
                }
            }else if let requestError = error{
                print("print error: \(requestError)")
            }else{
                print("unexpected error")
            }
        })
        task.resume()

【问题讨论】:

  • 为什么要使用popViewController 导航到新的视图控制器?在我看来,您无法设置该布尔值,因为您实际上从未将目标视图控制器添加到视图堆栈中。
  • 另外,请不要以小写字母开头你的类名。使用大写。

标签: ios swift segue


【解决方案1】:

试试这个。

let task = session.dataTask(with: request, completionHandler: { (data, response, error) in

            if let jsonData = data{

                do{
                    let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: [])

                    guard
                        let jsonDictionary = jsonObject as? [String:String],
                        let message = jsonDictionary["msg"] else{
                            print("unexpected data structure from server")
                            return
                    }

                    if(message == "folder created success"){
                        // Folder created success
                        print("folder created success")


                            DispatchQueue.main.async{

                                 for element in (self.navigationController?.viewControllers)! {
                                      if element.isKind(of:menuTableViewController) {
                                       let prevVC  = element as? menuTableViewController
                                       prevVC?. segueContainerNewFolderCreatedBool = true
                                        self.navigationController?.popViewController(animated: true)
                                      break
            }
        }


                            }// End DispatchQueue

                        })
                        segue.perform()


                    }else{
                        // Folder created fail
                    }
                }catch let error{
                    print("error detail: \(error)")
                }
            }else if let requestError = error{
                print("print error: \(requestError)")
            }else{
                print("unexpected error")
            }
        })
        task.resume()

请参阅下面的链接。

How to identify previous view controller in navigation stack

【讨论】:

  • 是的,我正在尝试返回,但需要从堆栈中删除当前的 viewController。你的回答不是我上面做的吗?从堆栈中弹出当前的 VC?我能够弹出当前视图控制器,但无法将数据传输到目标 vc
【解决方案2】:

您不是在尝试pop,而是在尝试呈现 UIViewController。另外,使用 segue 最简单的方法是在 Storyboard 中创建它,然后从 viewController1 中调用它:

performSegue(withIdentifier: YOUR_SEGUE_IDENTIFIER, sender: self)

要使用 segue 传输数据,您需要使用 prepare(for segue: UIStoryboardSegue, sender: Any?)。这是一个例子:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "YOUR_SEGUE_IDENTIFIER" {
        if let destination = segue.destination as? YOUR_VC_CLASS {
            destination.YOUR_VARIABLE = YOUR_VALUE
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2015-02-20
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多