dovedevic
dovedevic

Reputation: 693

Sending data through Unwind Segues

I have a custom unwind segue issue. Let me explain my controller setup:

I have a main screen which is a navigation controller with a cell view inside. Within this view, there is a button to add data, and in that view is 4 buttons for additional "types" of data to add. Once a user selects one of those four options, they are presented with a view controller specific to their choice that lets them enter data with a done button. The three screens respectively I will from now on refer to them as Main View, Options View, then Data View(all 4 options follow this convention).

After some tutorials I made a custom unwind segue in Main View's controller class, as follows:

@IBAction func unwindToTables(segue: UIStoryboardSegue) {
    //function proto for adding data here
    //populateTableWithData(data :ItemData)
}

In the storyboard editor, anytime I control + click from any View Controller to it's exit, it lists my unwind segue properly and this works fine.

I would now like to send data through the unwind. In Data View, I have a Done button that constructs and initializes a class of data, called ItemData to which I would like to pass through the segue.

Most of the questions I found on SO or other sites with this deals with normal segues, and when I try to implement them anyways the application causes a runtime error / does not compile.

Has anyone come into the issue before, and have a solution for said issue? Any help or points in the right direction would be much appreciated!

Edit:

I edited my unwind function as follows:

@IBAction func unwindToTables(segue: UIStoryboardSegue) {
    let dataC = segue.sourceViewController as? DataVC
    let data : ItemData = dataC!.SubmittedData! //unwrapping error

    print(data.Name)


    //save data

}

and on top of every New{1-4}ViewController I have the following:

import UIKit

class New1ViewController: DataVC,

and I made a new superclass DataVC:

import Foundation

class DataVC: UITableViewController {
    var SubmittedData: ItemData?
}

but now I am getting an unwrapping issue... must I initialize SubmittedData prior?

Edit 2:

Thought I might add the Done button press I am doing...

@IBAction func DonePressed(sender: AnyObject) {

    let n = ...
    ...
    let d = ...

    super.SubmittedData = ItemData(FieldType: "1", CName: n!, CPhone: p!, CAddress: a!, ShouldBe: s!, Repeats: r!, Starts: b, RemindMe: m!, AdditionalNotes: d!)

}

Upvotes: 0

Views: 112

Answers (1)

Paulw11
Paulw11

Reputation: 114846

The UIStoryboardSegue that is passed to your unwindToTables: function has a property sourceViewControllee this will be the instance of your Data view controller.

You need all of your view controllers to inherit from a common superclass, so that you can add the property you need:

class DataVC: UITableViewController {
    var submittedData: ItemData?
}

Then you would have something like:

class New1ViewController: DataVC,... {
...
}

Then in your unwind method you can retrieve the submittedData property

@IBAction func unwindToTables(segue: UIStoryboardSegue) {
    if let dataVC = segue.sourceViewController as? DataVC {
      if let info = dataVC.submittedData {
         ...
      }
    }
 }

Upvotes: 2

Related Questions