在 Swift 中将数据从视图控制器传递到子控制器

Pass data from View Controller to Child Controller in Swift

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

var text = "Hello"
var sVC = SecondViewController()
sVC.string = text

并且它会将 Hello 传递给第二个视图控制器中的变量 string。然后做同样的事情将数据从第二个视图控制器传递到第三个视图控制器。但不幸的是,这个逻辑是行不通的。我试图将数据从 VC1 传递到 ParentVC,然后再传递到 ChildVC。我还尝试将数据从 VC1 直接传递到 ChildVC,但这似乎也不起作用。

这是我的

import UIKit
class ViewController1: UIViewController {

var a = "Test"

override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.a = a
  }
}

我能够将数据传递给父视图控制器并打印 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)

    }
}

在子视图控制器中我有:

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

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

override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.a = a
}

而且我猜你正在代码中的其他地方加载或展示这个控制器。如果是这样,您就可以成功打印正在设置的变量。

println(a) -> "Test"

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

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

您应该查看其中的一些,以更好地了解事情的运作方式以及您可以遵循的路径来完成您想要的。

Instantiate and Present a viewController in Swift

UIViewController class reference

How can I passing data from parent view controller to child view controller?

希望对您有所帮助!