Passing array through segue in swift

后端 未结 3 1099
南笙
南笙 2021-01-24 08:20

I\'ve been struggling for a few days now with passing an array from my SecondViewController to my FirstViewController using Swift.

From my rese

相关标签:
3条回答
  • 2021-01-24 08:44

    Your code looks fine, use the following prepareforsegue as it helps figure out where the problem could be

    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
             }
         }
    }
    
    0 讨论(0)
  • 2021-01-24 08:57

    Did you know that array in Swift are value type. So, when you assign array to some other variable or pass it to some method, the value is passed; not the reference to actual object. When you pass your array to second view controller, it copies the content of your original array. You are then adding to this array which do not change the content of original array.

    I would suggest you to create some kind of callback or delegate pattern from second view controller to first view controller to inform the changes such that first view controller would also modify the original array content.

    Here is a small portion of code that will help you understand this,

    let originalArray = ["a", "b", "c"]
    
    var newArray = originalArray
    
    newArray.append("d")
    
    print(originalArray) // prints ["a", "b", "c"]
    print(newArray) // prints ["a", "b", "c", "d"]
    
    0 讨论(0)
  • 2021-01-24 09:00

    You can use protocol to pass data between view controllers

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

    For passing data from first view controller to second in your Main view Controller when you want to show your first view controller:

    1. you should set main view controller to your view controller delegate, yourFirstViewController.setDlegate(self)

    2. In FirstViewController you should raise an event to main with onButtonClicked([String])

    3. In onButtonClicked([String]) you can call secondViewController and pass your array with 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)
      }
      

    In your First view controller

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

    In your second view controller

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

    I have not Mac OS to check my code now please just read this code not copy, I'll edit this code tomorrow

    0 讨论(0)
提交回复
热议问题