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

7

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

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

我需要翻译的内容与IT技术有关。需要将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)
}  

你的代码中 cvC 是什么意思? - Leo
这应该是一个变量。我会编辑它。 - Pablo Picasso
每次都在创建新的控制器。ChildViewController 在加载视图时会创建一个新的 ParentViewController,而 ParentViewController 则会在 test 方法和 viewDidAppear 中再次创建新的 ChildViewController,但你只在 test 方法中传递了 a 属性,这对子控制器没有任何作用。 - redent84
我该如何将它传递到 ChildViewController - Pablo Picasso
1个回答

4
当从您的ViewController加载ParentViewController时,没有视图加载到内存中。它只是您的ParentViewController类的一个实例。
override func viewDidLoad() {
   var pVC = ParentViewController()
   pVC.a = a
}

我猜想你正在其他地方加载或呈现此控制器。如果是这样,那么成功打印设置的变量是有意义的。
"println(a) ->“Test”"
然而,当你实例化你的ChildViewController时,你为它的convenience init提供了一个frame,并且实际上初始化了视图层次结构,这反过来触发了viewDidLoad事件。这在a变量从ParentViewController -> ViewDidLoad中被设置之前执行。你打印a变量的结果实际上是一个空字符串。
一种选择是将你的逻辑放在它们自己的函数中,你明确地调用这些函数。可以选择使用数据作为参数或在调用函数之前设置变量。
你应该查看一些这些链接,以更好地了解事物的工作方式和你可以遵循的路径来完成你想要的事情。
"在Swift中实例化和呈现视图控制器"

UIViewController类参考

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

希望这可以帮助您!


我尝试将其放入一个函数中,该函数明确从子VC调用,但这并没有起作用。我更新了代码。有什么建议吗? - Pablo Picasso
那不完全是我想要的。请告诉我们,当设置这些视图时,您是否打算使用故事板或以编程方式创建? - Laffen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接