快速通过segue传递数组

我一直在挣扎几天,从我的SecondViewController传递数组到我的FirstViewController使用Swift。

从我的研究中,我发现与prepareForSegue将是一个可行的select,但我似乎无法弄清楚。 我究竟做错了什么?

在SecondViewController中,我的prepareForSegue如下所示:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var DVC: FirstViewController = segue.destinationViewController as! FirstViewController DVC.mySeguedArray = myIncomeArray } 

我的FirstViewController看起来像这样:

 class FirstViewController: UIViewController { @IBOutlet weak var textView: UITextView! var myIncomeArray: [Income] = [] var mySeguedArray: [Income] = [] override func viewDidLoad() { super.viewDidLoad() myIncomeArray = mySeguedArray } 

另外值得一提的是,我确信我在SecondViewController填充数组,因为在向它添加新的Income对象时,通过打印出数组的大小来testing它。 但FirstViewController的数组在检测到segue后的大小时只返回0

编辑:添加故事板StoryBoard的图片

你的代码看起来不错,使用下面的prepareforsegue,因为它有助于找出问题的出现点

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "segueIdInStoryboard" { if let DVC = segue.destinationViewController as? FirstViewController{ DVC.mySeguedArray = myIncomeArray } else { print("Data NOT Passed! destination vc is not set to firstVC") } } else { print("Id doesnt match with Storyboard segue Id") } } class FirstViewController: UIViewController { @IBOutlet weak var textView: UITextView! var myIncomeArray: [Income]! var mySeguedArray: [Income]!{ didSet{ myIncomeArray = mySeguedArray //no need to call viewDidLoad } } } 

你知道在Swift中的数组是值types吗? 所以,当你将数组赋值给某个其他variables或将其传递给某个方法时,该值将被传递; 不是对实际对象的引用。 将数组传递给第二个视图控制器时,它将复制原始数组的内容。 然后,您将添加到此数组不会更改原始数组的内容。

我build议你创build一些callback或委托模式从第二个视图控制器到第一个视图控制器通知更改,以便第一个视图控制器也将修改原始数组内容。

这里有一小部分代码可以帮助你理解这一点,

 let originalArray = ["a", "b", "c"] var newArray = originalArray newArray.append("d") print(originalArray) // prints ["a", "b", "c"] print(newArray) // prints ["a", "b", "c", "d"] 

您可以使用协议在视图控制器之间传递数据

 protocol YourFirstViewControllerDelegate: class { func onButtonClicked(yourString: [String]) } 

当你想要显示你的第一个视图控制器时,为了将数据从第一个视图控制器传递到第二个视图控

  1. 你应该设置主视图控制器到你的视图控制器委托, yourFirstViewController.setDlegate(self)

  2. 在FirstViewController中,您应该使用onButtonClicked([String])将事件引发到main

  3. 在onButtonClicked([String])中,您可以调用secondViewController并使用onSecondViewController([String])传递数组

     class MainViewController: UIViewController,YourFirstViewControllerDelegate{ var yourString = [String]() weak var vcFirst: FirstViewController? weak var vcSecond: SecondViewController? func onFirstViewController(){ if (self.vcFirst == nil){ self.vcFirst = self.storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController self.vcFirst!.view.translatesAutoresizingMaskIntoConstraints = false self.vcFirst?.setDelegate(youeFirstViewControllerDelegate: self) } self.setActiveController(viewController: self.vcFirst) } func onSecondViewController(yourString:[String]){ if (self.Second == nil){ self.Second = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController self.vcSecond!.view.translatesAutoresizingMaskIntoConstraints = false self.vcSecond.setArray(yourArray: self.yourArray) } self.setActiveController(viewController: self.vcSecond) } ....// your view controller method func onButtonClicked(yourString: [String]){ self.yourString = yourString onSecondViewController(yourString:self.yourString) } 

在您的第一个视图控制器

 class FirstViewController: UIViewController{ weak var yourFirstViewControllerDelegate: YourFirstViewControllerDelegate? var yourString = ["test1","test2"] // all your overide method should be here func setDelegate(yourFirstViewControllerDelegate: YourFirstViewControllerDelegate){ self.yourFirstViewControllerDelegate = yourFirstViewControllerDelegate } func onButtonClicked(){ self.yourFirstViewControllerDelegate.onButtonClicked(self.yourString) } 

在你的第二个视图控制器

 class SecondViewController: UIViewController{ var yourString = [String] // all your overide method should be here and you can use your [String] func setArray(yourString:[String]){ self.yourString = yourString } } 

我没有Mac OS来检查我的代码,请只读这个代码不要复制,我明天编辑这个代码