将数据从View Controller传递到Swift中的Child Controller

Pab*_*sso 6 parent-child ios swift

我有三个视图控制器(VC1,父视图控制器和子视图控制器).加载ParentVC时,如何将数据从VC1传递到子视图控制器?通常我可以在First View Controller中使用它

var text = "Hello"
var sVC = SecondViewController()
sVC.string = text
Run Code Online (Sandbox Code Playgroud)

它将传递Hellostring第二个视图控制器中的变量.然后做同样的事情将数据从第二视图控制器传递到第三视图控制器.但不幸的是,这种逻辑不起作用.我试图将数据从VC1传递给ParentVC然后传递给ChildVC.我也尝试将数据从VC1直接传递给ChildVC,但这似乎也不起作用.

这就是我所拥有的

import UIKit
class ViewController1: UIViewController {

var a = "Test"

override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.a = a
  }
}
Run Code Online (Sandbox Code Playgroud)

我能够将数据传递给父视图控制器并打印,Test但它不适用于子视图控制器

import UIKit

class ParentViewController: UIViewController {

var pageMenu: CAPSPageMenu?
var a = ""

 func test() {

  var cvC = ChildViewController(frame: self.view.frame)
   cvC.a = a
}

override func viewDidLoad() {
   println(a)

}

override func viewWillAppear(animated: Bool) {

}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    // MARK: - Scroll menu setup

    // Initialize view controllers to display and place in array
    var controllerArray : [UIViewController] = []

    var controller1 : ChildViewController = ChildViewController(nibName: nil, bundle: nil)
    controller1.title = "View Controller"
    controllerArray.append(controller1)

    // Initialize scroll menu
    pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, 65, self.view.frame.width, self.view.frame.height), pageMenuOptions: parameters)

    self.view.addSubview(pageMenu!.view)

    }
}
Run Code Online (Sandbox Code Playgroud)

在Child View Controller我有:

import UIKit

class ChildViewController: UIViewController {

var a = ""

convenience init(frame:CGRect){
    self.init(nibName: nil, bundle: nil)
    self.view.frame = frame

}

override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.test()
   println(a)
}  
Run Code Online (Sandbox Code Playgroud)

Laf*_*fen 4

ParentViewController从您的加载时ViewController,没有视图加载到内存中。这只是您ParentViewController班级的一个实例。

override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.a = a
}
Run Code Online (Sandbox Code Playgroud)

我猜您正在代码中的其他地方加载或呈现此控制器。如果是这样,那么您成功打印了正在设置的变量就有意义了。

println(a) -> “测试”

但是,当您实例化 时ChildViewController,您为其提供了一个框架convenience init,并且实际上正在启动视图层次结构,这反过来又触发事件viewDidLoad。这是在a设置变量之前执行的ParentViewController -> ViewDidLoad。打印变量的结果a实际上是一个空字符串。

一种选择是将您的逻辑放入您显式调用的自己的函数中。可以选择将数据作为参数,或者在调用函数之前设置变量。

您应该查看其中的一些内容,以更好地了解事情的运作方式以及实现您想要的目标可以遵循的路径。

在 Swift 中实例化并呈现 viewController

UIViewController 类参考

如何将数据从父视图控制器传递到子视图控制器?

希望这可以帮助!