I'm new to iOS and Objective-C and the whole MVC paradigm and I'm stuck with the following:
I have a view that acts as a data entry form and I want to give the user the option to select multiple products. The products are listed on another view with a UITableViewController
and I have enabled multiple selections.
How do I transfer the data from one view to another? I will be holding the selections on the UITableView
in an array, but how do I then pass that back to the previous data entry form view so it can be saved along with the other data to Core Data on submission of the form?
I have surfed around and seen some people declare an array in the app delegate. I read something about singletons, but I don't understand what these are and I read something about creating a data model.
What would be the correct way of performing this and how would I go about it?
Best Answer
This question seems to be very popular here on Stack Overflow so I thought I would try and give a better answer to help out people starting in the world of iOS like me.
Passing Data Forward
Passing data forward to a view controller from another view controller. You would use this method if you wanted to pass an object/value from one view controller to another view controller that you may be pushing on to a navigation stack.
For this example, we will have
ViewControllerA
andViewControllerB
To pass a
BOOL
value fromViewControllerA
toViewControllerB
we would do the following.in
ViewControllerB.h
create a property for theBOOL
in
ViewControllerA
you need to tell it aboutViewControllerB
so use anThen where you want to load the view, for example,
didSelectRowAtIndex
or someIBAction
, you need to set the property inViewControllerB
before you push it onto the navigation stack.This will set
isSomethingEnabled
inViewControllerB
toBOOL
valueYES
.Passing Data Forward using Segues
If you are using Storyboards you are most likely using segues and will need this procedure to pass data forward. This is similar to the above but instead of passing the data before you push the view controller, you use a method called
So to pass a
BOOL
fromViewControllerA
toViewControllerB
we would do the following:in
ViewControllerB.h
create a property for theBOOL
in
ViewControllerA
you need to tell it aboutViewControllerB
, so use anCreate the segue from
ViewControllerA
toViewControllerB
on the storyboard and give it an identifier. In this example we'll call it"showDetailSegue"
Next, we need to add the method to
ViewControllerA
that is called when any segue is performed. Because of this we need to detect which segue was called and then do something. In our example, we will check for"showDetailSegue"
and if that's performed, we will pass ourBOOL
value toViewControllerB
If you have your views embedded in a navigation controller, you need to change the method above slightly to the following
This will set
isSomethingEnabled
inViewControllerB
toBOOL
valueYES
.Passing Data Back
To pass data back from
ViewControllerB
toViewControllerA
you need to use Protocols and Delegates or Blocks, the latter can be used as a loosely coupled mechanism for callbacks.To do this we will make
ViewControllerA
a delegate ofViewControllerB
. This allowsViewControllerB
to send a message back toViewControllerA
enabling us to send data back.For
ViewControllerA
to be a delegate ofViewControllerB
it must conform toViewControllerB
's protocol which we have to specify. This tellsViewControllerA
which methods it must implement.In
ViewControllerB.h
, below the#import
, but above@interface
you specify the protocol.Next still in the
ViewControllerB.h
, you need to set up adelegate
property and synthesize inViewControllerB.m
In
ViewControllerB
we call a message on thedelegate
when we pop the view controller.That's it for
ViewControllerB
. Now inViewControllerA.h
, tellViewControllerA
to importViewControllerB
and conform to its protocol.In
ViewControllerA.m
implement the following method from our protocolBefore pushing
viewControllerB
to navigation stack we need to tellViewControllerB
thatViewControllerA
is its delegate, otherwise we will get an error.References
NSNotification center
It's another way to pass data.
Passing Data back from one class to another (A class can be any controller, Network/session manager, UIView subclass or any other class)
Blocks are anonymous functions.
This example passes data from Controller B to Controller A
Define a block
Add block handler (listener)
Where you need a value (for example, you need your API response in ControllerA or you need ContorllerB data on A)
Go to Controller B
Fire block
Another Working Example for Blocks