If you find that passing data is getting complex, then create some singleton object that all view controllers can access, and use it as an intermediary to receive and vend data objects. You can use key/value or some other scheme to do this.
EDIT: this is really simple. Define a class Foo, and have the class create a singleton, and offer a way for any class to get it (Foo *foo = [Foo sharedFoo])
. Add methods to the singleton to support setObject:forKey:
and objectForKey:
just like NSMutableDictionary
, or whatever you want. If you need this to be thread safe its harder but similar - in that case you need to use a serial dispatch queue for all access. Each of the above techniques have many posts on SO (singleton, serial dispatch queue threading, etc).
Now all you classes can include Foo.h in them, access the singleton, and ask it for things or provide it things.