Multiple view controllers on screen at once?











up vote
19
down vote

favorite
9












I am trying to wrap my head around controllers in Cocoa Touch. The main problem is that I would like to have more than one controller “on screen” at once – I want to have a large view (with controller A) composed of smaller views controlled by their own controllers (say B). I’d like to have it this way because the division makes the code much cleaner. What’s bad is that the additional controllers (of type B) are not “first-class citizens” on the screen, for example they do not receive the autorotation queries and notifications. (And cannot easily display modal controllers, they have to send the presentModal… message to their parent controller.)



What is the difference between the A and B controllers from Cocoa viewpoint? Does the system keep some kind of pointer to the “frontmost controller”, a privileged one to which it sends notifications and such stuff? Why don’t the other controllers receive them, even though their views are on the screen? Is having multiple controllers “on screen” considered a hack? Or is it supported and I am just missing some point? Thank you.





More about the problem I am trying to solve: I am writing a simple photo browser. Photos are displayed in full screen, user can swipe left or right to change photos. The A controller takes care of the scrolling part and the B controllers take care of each photo itself.



Isolating B seemed like a good idea, since the photos are loaded from network and there is a lot that can happen, like the network might be down et cetera. In the B controller the code is fairly simple, since B only works with one particular photo. If I moved the code to the A controller, things would get messy.



The only thing I don’t like about the current solution is that I have to manually work around B not being a “first-class” controller. I have to pass some calls manually through A to B and when B wants to display a modal dialog, it has to send the presentModal… to A. Which is ugly.










share|improve this question




























    up vote
    19
    down vote

    favorite
    9












    I am trying to wrap my head around controllers in Cocoa Touch. The main problem is that I would like to have more than one controller “on screen” at once – I want to have a large view (with controller A) composed of smaller views controlled by their own controllers (say B). I’d like to have it this way because the division makes the code much cleaner. What’s bad is that the additional controllers (of type B) are not “first-class citizens” on the screen, for example they do not receive the autorotation queries and notifications. (And cannot easily display modal controllers, they have to send the presentModal… message to their parent controller.)



    What is the difference between the A and B controllers from Cocoa viewpoint? Does the system keep some kind of pointer to the “frontmost controller”, a privileged one to which it sends notifications and such stuff? Why don’t the other controllers receive them, even though their views are on the screen? Is having multiple controllers “on screen” considered a hack? Or is it supported and I am just missing some point? Thank you.





    More about the problem I am trying to solve: I am writing a simple photo browser. Photos are displayed in full screen, user can swipe left or right to change photos. The A controller takes care of the scrolling part and the B controllers take care of each photo itself.



    Isolating B seemed like a good idea, since the photos are loaded from network and there is a lot that can happen, like the network might be down et cetera. In the B controller the code is fairly simple, since B only works with one particular photo. If I moved the code to the A controller, things would get messy.



    The only thing I don’t like about the current solution is that I have to manually work around B not being a “first-class” controller. I have to pass some calls manually through A to B and when B wants to display a modal dialog, it has to send the presentModal… to A. Which is ugly.










    share|improve this question


























      up vote
      19
      down vote

      favorite
      9









      up vote
      19
      down vote

      favorite
      9






      9





      I am trying to wrap my head around controllers in Cocoa Touch. The main problem is that I would like to have more than one controller “on screen” at once – I want to have a large view (with controller A) composed of smaller views controlled by their own controllers (say B). I’d like to have it this way because the division makes the code much cleaner. What’s bad is that the additional controllers (of type B) are not “first-class citizens” on the screen, for example they do not receive the autorotation queries and notifications. (And cannot easily display modal controllers, they have to send the presentModal… message to their parent controller.)



      What is the difference between the A and B controllers from Cocoa viewpoint? Does the system keep some kind of pointer to the “frontmost controller”, a privileged one to which it sends notifications and such stuff? Why don’t the other controllers receive them, even though their views are on the screen? Is having multiple controllers “on screen” considered a hack? Or is it supported and I am just missing some point? Thank you.





      More about the problem I am trying to solve: I am writing a simple photo browser. Photos are displayed in full screen, user can swipe left or right to change photos. The A controller takes care of the scrolling part and the B controllers take care of each photo itself.



      Isolating B seemed like a good idea, since the photos are loaded from network and there is a lot that can happen, like the network might be down et cetera. In the B controller the code is fairly simple, since B only works with one particular photo. If I moved the code to the A controller, things would get messy.



      The only thing I don’t like about the current solution is that I have to manually work around B not being a “first-class” controller. I have to pass some calls manually through A to B and when B wants to display a modal dialog, it has to send the presentModal… to A. Which is ugly.










      share|improve this question















      I am trying to wrap my head around controllers in Cocoa Touch. The main problem is that I would like to have more than one controller “on screen” at once – I want to have a large view (with controller A) composed of smaller views controlled by their own controllers (say B). I’d like to have it this way because the division makes the code much cleaner. What’s bad is that the additional controllers (of type B) are not “first-class citizens” on the screen, for example they do not receive the autorotation queries and notifications. (And cannot easily display modal controllers, they have to send the presentModal… message to their parent controller.)



      What is the difference between the A and B controllers from Cocoa viewpoint? Does the system keep some kind of pointer to the “frontmost controller”, a privileged one to which it sends notifications and such stuff? Why don’t the other controllers receive them, even though their views are on the screen? Is having multiple controllers “on screen” considered a hack? Or is it supported and I am just missing some point? Thank you.





      More about the problem I am trying to solve: I am writing a simple photo browser. Photos are displayed in full screen, user can swipe left or right to change photos. The A controller takes care of the scrolling part and the B controllers take care of each photo itself.



      Isolating B seemed like a good idea, since the photos are loaded from network and there is a lot that can happen, like the network might be down et cetera. In the B controller the code is fairly simple, since B only works with one particular photo. If I moved the code to the A controller, things would get messy.



      The only thing I don’t like about the current solution is that I have to manually work around B not being a “first-class” controller. I have to pass some calls manually through A to B and when B wants to display a modal dialog, it has to send the presentModal… to A. Which is ugly.







      iphone cocoa-touch uiviewcontroller






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited May 2 '17 at 3:10









      Kris Roofe

      13.3k759135




      13.3k759135










      asked Mar 11 '10 at 9:34









      zoul

      77.5k36218321




      77.5k36218321
























          5 Answers
          5






          active

          oldest

          votes

















          up vote
          13
          down vote



          accepted










          There is now a first-class support for this scenario since iOS 5, it’s called controller containment.



          swift controller containment



          objc controller containment.






          share|improve this answer






























            up vote
            12
            down vote













            It's not closely related to the original question but important. Apple clearly states in View Controller Programming Guide that a view controller is responsible for controlling exactly one screen's content:



            "Each custom view controller object you create is responsible for managing exactly one screen’s worth of content. The one-to-one correspondence between a view controller and a screen is a very important consideration in the design of your application. You should not use multiple custom view controllers to manage different portions of the same screen. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.



            Note: If you want to divide a single screen into multiple areas and manage each one separately, use generic controller objects (custom objects descending from NSObject) instead of view controller objects to manage each subsection of the screen. Then use a single view controller object to manage the generic controller objects. The view controller coordinates the overall screen interactions but forwards messages as needed to the generic controller objects it manages."



            However in iPad Programming Guide they also say that there may be container view controllers:



            "A view controller is responsible for a single view. Most of the time, a view controller’s view is expected to fill the entire span of the application window. In some cases, though, a view controller may be embedded inside another view controller (known as a container view controller) and presented along with other content. Navigation and tab bar controllers are examples of container view controllers."



            Up to my current knowledge I would not use sub-view controllers in a view controller but try to subclass NSObject and send messages to them from my main view controller.



            Also check this thread:
            MGSplitViewController discussion






            share|improve this answer

















            • 1




              The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
              – mskw
              Nov 21 '13 at 14:13


















            up vote
            8
            down vote













            First, and this is important, view controllers don't get "on screen" -- views do. Your "top level" controller can certainly pass along the kinds of messages you're describing to its "sub-view-controllers". In fact, this is how most apps work. Consider an app that has a tab bar, and where the views use navigation controllers. You actually have several view controllers "running" at the same time, each with its own view on screen at once -- your "root" view controller will be an instance (or subclass) of UITabBarController, which then has several nested UINavigationControllers, each which will display nested view controllers (like an instance or a subclass of UITableViewController).



            You might want to read up a bit on how responder chains work. Consider a touch event. It will be generated for the view closest to the top of the stack, that can receive events, which is also underneath the tap. If that view can't handle it, it gets passed up the view hierarchy food chain until something deals with it (and then eats it).



            As to the specifics of your question, on the whole, I'm not sure exactly what the strategy you describe is really doing to benefit you in terms of complexity. It depends on how exactly you're implementing things, but having separate view controllers for each little subview may require more bookkeeping code than just having one view controller that knows about all its sub-view components.






            share|improve this answer





















            • Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
              – zoul
              Mar 11 '10 at 10:12


















            up vote
            6
            down vote













            This is a pretty old question, but since I guess there are people who might face the same problem today I'd like to share my solution.
            I was writing this application that had this one screen with a lot of information, pagination, controls etc. Since according to Apple's MVC documentation on the role of ViewControllers, you should not implement the logic in view itself, or access the data model directly from it, I had to choose between having a Massive ViewController with a few thousand lines of code which was both hard to maintain and debug(even with unit tests) or find a new way.



            My solution was to use UIContainerView like below:
            enter image description here



            this way, you can implement each part's logic in it's own ViewController, and the parent view controller takes care of constraints and sizing of the views.


            Note: This answer is just a guide to show the way, you can find a good and detailed explanation on how it works and how to implement it HERE






            share|improve this answer




























              up vote
              5
              down vote













              Actually you can make it work earlier than iOS 5, since most of us are targeting 4.x and 5.x at the same time. I've created a solution that works in both, and it works great, few apps in appstore use it :) Read my article about this or just download and use a simple class that I've created for this purpose.






              share|improve this answer























              • It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                – ader
                Feb 28 '12 at 11:51










              • I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                – Krzysztof Zabłocki
                Mar 1 '12 at 11:38













              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














               

              draft saved


              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f2423858%2fmultiple-view-controllers-on-screen-at-once%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              5 Answers
              5






              active

              oldest

              votes








              5 Answers
              5






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes








              up vote
              13
              down vote



              accepted










              There is now a first-class support for this scenario since iOS 5, it’s called controller containment.



              swift controller containment



              objc controller containment.






              share|improve this answer



























                up vote
                13
                down vote



                accepted










                There is now a first-class support for this scenario since iOS 5, it’s called controller containment.



                swift controller containment



                objc controller containment.






                share|improve this answer

























                  up vote
                  13
                  down vote



                  accepted







                  up vote
                  13
                  down vote



                  accepted






                  There is now a first-class support for this scenario since iOS 5, it’s called controller containment.



                  swift controller containment



                  objc controller containment.






                  share|improve this answer














                  There is now a first-class support for this scenario since iOS 5, it’s called controller containment.



                  swift controller containment



                  objc controller containment.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 21 at 7:17









                  Community

                  11




                  11










                  answered Dec 6 '11 at 17:27









                  zoul

                  77.5k36218321




                  77.5k36218321
























                      up vote
                      12
                      down vote













                      It's not closely related to the original question but important. Apple clearly states in View Controller Programming Guide that a view controller is responsible for controlling exactly one screen's content:



                      "Each custom view controller object you create is responsible for managing exactly one screen’s worth of content. The one-to-one correspondence between a view controller and a screen is a very important consideration in the design of your application. You should not use multiple custom view controllers to manage different portions of the same screen. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.



                      Note: If you want to divide a single screen into multiple areas and manage each one separately, use generic controller objects (custom objects descending from NSObject) instead of view controller objects to manage each subsection of the screen. Then use a single view controller object to manage the generic controller objects. The view controller coordinates the overall screen interactions but forwards messages as needed to the generic controller objects it manages."



                      However in iPad Programming Guide they also say that there may be container view controllers:



                      "A view controller is responsible for a single view. Most of the time, a view controller’s view is expected to fill the entire span of the application window. In some cases, though, a view controller may be embedded inside another view controller (known as a container view controller) and presented along with other content. Navigation and tab bar controllers are examples of container view controllers."



                      Up to my current knowledge I would not use sub-view controllers in a view controller but try to subclass NSObject and send messages to them from my main view controller.



                      Also check this thread:
                      MGSplitViewController discussion






                      share|improve this answer

















                      • 1




                        The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                        – mskw
                        Nov 21 '13 at 14:13















                      up vote
                      12
                      down vote













                      It's not closely related to the original question but important. Apple clearly states in View Controller Programming Guide that a view controller is responsible for controlling exactly one screen's content:



                      "Each custom view controller object you create is responsible for managing exactly one screen’s worth of content. The one-to-one correspondence between a view controller and a screen is a very important consideration in the design of your application. You should not use multiple custom view controllers to manage different portions of the same screen. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.



                      Note: If you want to divide a single screen into multiple areas and manage each one separately, use generic controller objects (custom objects descending from NSObject) instead of view controller objects to manage each subsection of the screen. Then use a single view controller object to manage the generic controller objects. The view controller coordinates the overall screen interactions but forwards messages as needed to the generic controller objects it manages."



                      However in iPad Programming Guide they also say that there may be container view controllers:



                      "A view controller is responsible for a single view. Most of the time, a view controller’s view is expected to fill the entire span of the application window. In some cases, though, a view controller may be embedded inside another view controller (known as a container view controller) and presented along with other content. Navigation and tab bar controllers are examples of container view controllers."



                      Up to my current knowledge I would not use sub-view controllers in a view controller but try to subclass NSObject and send messages to them from my main view controller.



                      Also check this thread:
                      MGSplitViewController discussion






                      share|improve this answer

















                      • 1




                        The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                        – mskw
                        Nov 21 '13 at 14:13













                      up vote
                      12
                      down vote










                      up vote
                      12
                      down vote









                      It's not closely related to the original question but important. Apple clearly states in View Controller Programming Guide that a view controller is responsible for controlling exactly one screen's content:



                      "Each custom view controller object you create is responsible for managing exactly one screen’s worth of content. The one-to-one correspondence between a view controller and a screen is a very important consideration in the design of your application. You should not use multiple custom view controllers to manage different portions of the same screen. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.



                      Note: If you want to divide a single screen into multiple areas and manage each one separately, use generic controller objects (custom objects descending from NSObject) instead of view controller objects to manage each subsection of the screen. Then use a single view controller object to manage the generic controller objects. The view controller coordinates the overall screen interactions but forwards messages as needed to the generic controller objects it manages."



                      However in iPad Programming Guide they also say that there may be container view controllers:



                      "A view controller is responsible for a single view. Most of the time, a view controller’s view is expected to fill the entire span of the application window. In some cases, though, a view controller may be embedded inside another view controller (known as a container view controller) and presented along with other content. Navigation and tab bar controllers are examples of container view controllers."



                      Up to my current knowledge I would not use sub-view controllers in a view controller but try to subclass NSObject and send messages to them from my main view controller.



                      Also check this thread:
                      MGSplitViewController discussion






                      share|improve this answer












                      It's not closely related to the original question but important. Apple clearly states in View Controller Programming Guide that a view controller is responsible for controlling exactly one screen's content:



                      "Each custom view controller object you create is responsible for managing exactly one screen’s worth of content. The one-to-one correspondence between a view controller and a screen is a very important consideration in the design of your application. You should not use multiple custom view controllers to manage different portions of the same screen. Similarly, you should not use a single custom view controller object to manage multiple screens worth of content.



                      Note: If you want to divide a single screen into multiple areas and manage each one separately, use generic controller objects (custom objects descending from NSObject) instead of view controller objects to manage each subsection of the screen. Then use a single view controller object to manage the generic controller objects. The view controller coordinates the overall screen interactions but forwards messages as needed to the generic controller objects it manages."



                      However in iPad Programming Guide they also say that there may be container view controllers:



                      "A view controller is responsible for a single view. Most of the time, a view controller’s view is expected to fill the entire span of the application window. In some cases, though, a view controller may be embedded inside another view controller (known as a container view controller) and presented along with other content. Navigation and tab bar controllers are examples of container view controllers."



                      Up to my current knowledge I would not use sub-view controllers in a view controller but try to subclass NSObject and send messages to them from my main view controller.



                      Also check this thread:
                      MGSplitViewController discussion







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Oct 5 '10 at 11:20









                      Peter Z.

                      12112




                      12112








                      • 1




                        The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                        – mskw
                        Nov 21 '13 at 14:13














                      • 1




                        The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                        – mskw
                        Nov 21 '13 at 14:13








                      1




                      1




                      The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                      – mskw
                      Nov 21 '13 at 14:13




                      The problem is how to pass a message from the generic NSObject controller Object to the View Controller. You'd need either delegates or NSNotifications which is a pain.
                      – mskw
                      Nov 21 '13 at 14:13










                      up vote
                      8
                      down vote













                      First, and this is important, view controllers don't get "on screen" -- views do. Your "top level" controller can certainly pass along the kinds of messages you're describing to its "sub-view-controllers". In fact, this is how most apps work. Consider an app that has a tab bar, and where the views use navigation controllers. You actually have several view controllers "running" at the same time, each with its own view on screen at once -- your "root" view controller will be an instance (or subclass) of UITabBarController, which then has several nested UINavigationControllers, each which will display nested view controllers (like an instance or a subclass of UITableViewController).



                      You might want to read up a bit on how responder chains work. Consider a touch event. It will be generated for the view closest to the top of the stack, that can receive events, which is also underneath the tap. If that view can't handle it, it gets passed up the view hierarchy food chain until something deals with it (and then eats it).



                      As to the specifics of your question, on the whole, I'm not sure exactly what the strategy you describe is really doing to benefit you in terms of complexity. It depends on how exactly you're implementing things, but having separate view controllers for each little subview may require more bookkeeping code than just having one view controller that knows about all its sub-view components.






                      share|improve this answer





















                      • Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                        – zoul
                        Mar 11 '10 at 10:12















                      up vote
                      8
                      down vote













                      First, and this is important, view controllers don't get "on screen" -- views do. Your "top level" controller can certainly pass along the kinds of messages you're describing to its "sub-view-controllers". In fact, this is how most apps work. Consider an app that has a tab bar, and where the views use navigation controllers. You actually have several view controllers "running" at the same time, each with its own view on screen at once -- your "root" view controller will be an instance (or subclass) of UITabBarController, which then has several nested UINavigationControllers, each which will display nested view controllers (like an instance or a subclass of UITableViewController).



                      You might want to read up a bit on how responder chains work. Consider a touch event. It will be generated for the view closest to the top of the stack, that can receive events, which is also underneath the tap. If that view can't handle it, it gets passed up the view hierarchy food chain until something deals with it (and then eats it).



                      As to the specifics of your question, on the whole, I'm not sure exactly what the strategy you describe is really doing to benefit you in terms of complexity. It depends on how exactly you're implementing things, but having separate view controllers for each little subview may require more bookkeeping code than just having one view controller that knows about all its sub-view components.






                      share|improve this answer





















                      • Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                        – zoul
                        Mar 11 '10 at 10:12













                      up vote
                      8
                      down vote










                      up vote
                      8
                      down vote









                      First, and this is important, view controllers don't get "on screen" -- views do. Your "top level" controller can certainly pass along the kinds of messages you're describing to its "sub-view-controllers". In fact, this is how most apps work. Consider an app that has a tab bar, and where the views use navigation controllers. You actually have several view controllers "running" at the same time, each with its own view on screen at once -- your "root" view controller will be an instance (or subclass) of UITabBarController, which then has several nested UINavigationControllers, each which will display nested view controllers (like an instance or a subclass of UITableViewController).



                      You might want to read up a bit on how responder chains work. Consider a touch event. It will be generated for the view closest to the top of the stack, that can receive events, which is also underneath the tap. If that view can't handle it, it gets passed up the view hierarchy food chain until something deals with it (and then eats it).



                      As to the specifics of your question, on the whole, I'm not sure exactly what the strategy you describe is really doing to benefit you in terms of complexity. It depends on how exactly you're implementing things, but having separate view controllers for each little subview may require more bookkeeping code than just having one view controller that knows about all its sub-view components.






                      share|improve this answer












                      First, and this is important, view controllers don't get "on screen" -- views do. Your "top level" controller can certainly pass along the kinds of messages you're describing to its "sub-view-controllers". In fact, this is how most apps work. Consider an app that has a tab bar, and where the views use navigation controllers. You actually have several view controllers "running" at the same time, each with its own view on screen at once -- your "root" view controller will be an instance (or subclass) of UITabBarController, which then has several nested UINavigationControllers, each which will display nested view controllers (like an instance or a subclass of UITableViewController).



                      You might want to read up a bit on how responder chains work. Consider a touch event. It will be generated for the view closest to the top of the stack, that can receive events, which is also underneath the tap. If that view can't handle it, it gets passed up the view hierarchy food chain until something deals with it (and then eats it).



                      As to the specifics of your question, on the whole, I'm not sure exactly what the strategy you describe is really doing to benefit you in terms of complexity. It depends on how exactly you're implementing things, but having separate view controllers for each little subview may require more bookkeeping code than just having one view controller that knows about all its sub-view components.







                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Mar 11 '10 at 10:06









                      Shaggy Frog

                      24.3k1576126




                      24.3k1576126












                      • Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                        – zoul
                        Mar 11 '10 at 10:12


















                      • Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                        – zoul
                        Mar 11 '10 at 10:12
















                      Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                      – zoul
                      Mar 11 '10 at 10:12




                      Good answer, thank you. I know that views come on screen, not controllers, that’s why I kept writing “on screen” in quotes, meaning “having its view on screen.” I’ll write more about the situation in the question.
                      – zoul
                      Mar 11 '10 at 10:12










                      up vote
                      6
                      down vote













                      This is a pretty old question, but since I guess there are people who might face the same problem today I'd like to share my solution.
                      I was writing this application that had this one screen with a lot of information, pagination, controls etc. Since according to Apple's MVC documentation on the role of ViewControllers, you should not implement the logic in view itself, or access the data model directly from it, I had to choose between having a Massive ViewController with a few thousand lines of code which was both hard to maintain and debug(even with unit tests) or find a new way.



                      My solution was to use UIContainerView like below:
                      enter image description here



                      this way, you can implement each part's logic in it's own ViewController, and the parent view controller takes care of constraints and sizing of the views.


                      Note: This answer is just a guide to show the way, you can find a good and detailed explanation on how it works and how to implement it HERE






                      share|improve this answer

























                        up vote
                        6
                        down vote













                        This is a pretty old question, but since I guess there are people who might face the same problem today I'd like to share my solution.
                        I was writing this application that had this one screen with a lot of information, pagination, controls etc. Since according to Apple's MVC documentation on the role of ViewControllers, you should not implement the logic in view itself, or access the data model directly from it, I had to choose between having a Massive ViewController with a few thousand lines of code which was both hard to maintain and debug(even with unit tests) or find a new way.



                        My solution was to use UIContainerView like below:
                        enter image description here



                        this way, you can implement each part's logic in it's own ViewController, and the parent view controller takes care of constraints and sizing of the views.


                        Note: This answer is just a guide to show the way, you can find a good and detailed explanation on how it works and how to implement it HERE






                        share|improve this answer























                          up vote
                          6
                          down vote










                          up vote
                          6
                          down vote









                          This is a pretty old question, but since I guess there are people who might face the same problem today I'd like to share my solution.
                          I was writing this application that had this one screen with a lot of information, pagination, controls etc. Since according to Apple's MVC documentation on the role of ViewControllers, you should not implement the logic in view itself, or access the data model directly from it, I had to choose between having a Massive ViewController with a few thousand lines of code which was both hard to maintain and debug(even with unit tests) or find a new way.



                          My solution was to use UIContainerView like below:
                          enter image description here



                          this way, you can implement each part's logic in it's own ViewController, and the parent view controller takes care of constraints and sizing of the views.


                          Note: This answer is just a guide to show the way, you can find a good and detailed explanation on how it works and how to implement it HERE






                          share|improve this answer












                          This is a pretty old question, but since I guess there are people who might face the same problem today I'd like to share my solution.
                          I was writing this application that had this one screen with a lot of information, pagination, controls etc. Since according to Apple's MVC documentation on the role of ViewControllers, you should not implement the logic in view itself, or access the data model directly from it, I had to choose between having a Massive ViewController with a few thousand lines of code which was both hard to maintain and debug(even with unit tests) or find a new way.



                          My solution was to use UIContainerView like below:
                          enter image description here



                          this way, you can implement each part's logic in it's own ViewController, and the parent view controller takes care of constraints and sizing of the views.


                          Note: This answer is just a guide to show the way, you can find a good and detailed explanation on how it works and how to implement it HERE







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Jan 13 '16 at 21:25









                          Reza Shayestehpour

                          96821527




                          96821527






















                              up vote
                              5
                              down vote













                              Actually you can make it work earlier than iOS 5, since most of us are targeting 4.x and 5.x at the same time. I've created a solution that works in both, and it works great, few apps in appstore use it :) Read my article about this or just download and use a simple class that I've created for this purpose.






                              share|improve this answer























                              • It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                                – ader
                                Feb 28 '12 at 11:51










                              • I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                                – Krzysztof Zabłocki
                                Mar 1 '12 at 11:38

















                              up vote
                              5
                              down vote













                              Actually you can make it work earlier than iOS 5, since most of us are targeting 4.x and 5.x at the same time. I've created a solution that works in both, and it works great, few apps in appstore use it :) Read my article about this or just download and use a simple class that I've created for this purpose.






                              share|improve this answer























                              • It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                                – ader
                                Feb 28 '12 at 11:51










                              • I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                                – Krzysztof Zabłocki
                                Mar 1 '12 at 11:38















                              up vote
                              5
                              down vote










                              up vote
                              5
                              down vote









                              Actually you can make it work earlier than iOS 5, since most of us are targeting 4.x and 5.x at the same time. I've created a solution that works in both, and it works great, few apps in appstore use it :) Read my article about this or just download and use a simple class that I've created for this purpose.






                              share|improve this answer














                              Actually you can make it work earlier than iOS 5, since most of us are targeting 4.x and 5.x at the same time. I've created a solution that works in both, and it works great, few apps in appstore use it :) Read my article about this or just download and use a simple class that I've created for this purpose.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited Feb 28 '12 at 11:51









                              zoul

                              77.5k36218321




                              77.5k36218321










                              answered Feb 28 '12 at 9:02









                              Krzysztof Zabłocki

                              1,28298




                              1,28298












                              • It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                                – ader
                                Feb 28 '12 at 11:51










                              • I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                                – Krzysztof Zabłocki
                                Mar 1 '12 at 11:38




















                              • It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                                – ader
                                Feb 28 '12 at 11:51










                              • I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                                – Krzysztof Zabłocki
                                Mar 1 '12 at 11:38


















                              It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                              – ader
                              Feb 28 '12 at 11:51




                              It's considered bad practice by Apple to do this before ios5 (i.e. before we had Apple' provided containment). Apple engineers told me so in person.
                              – ader
                              Feb 28 '12 at 11:51












                              I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                              – Krzysztof Zabłocki
                              Mar 1 '12 at 11:38






                              I had been using this solution for over a year, and I never had any problems with it. The problem is most of implementations I've seen didn't take care of properly handling memory and all important methods, and mine DOES handle it properly. As much as I Love apple view controller containment should be introduced with the release of iPad, as this is the most common scenario for multiple view controllers. Again this is solution that is approved in many apps in appstore. This solutions allows to reuse iPhone view controllers without any fuss or headache.
                              – Krzysztof Zabłocki
                              Mar 1 '12 at 11:38




















                               

                              draft saved


                              draft discarded



















































                               


                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f2423858%2fmultiple-view-controllers-on-screen-at-once%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Berounka

                              Sphinx de Gizeh

                              Different font size/position of beamer's navigation symbols template's content depending on regular/plain...