Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reusing UIViewController for modal and non-modal situations

I have a UIViewController — let's call it "FormController" — which is simply a form that edits an object. I want to use it in 2 different situations:

  1. Creating a new object — using using UINavigationController's presentModalViewController: method.

  2. Editing an existing object — push the view controller onto the UINavigationController stack, not using a dialog method.

There is a slight difference in that in the modal situation I would like to have a toolbar with "Cancel" and "Done" buttons, whereas in the stack situation I would like to just have the navigation bar provided by the UINavigationController.

This would be similar to the Contacts application where the "New Contact" and the "Edit Contact" screens seem to use the same view controller, but the New Contact form is presented modally while the Edit screen is pushed onto the navigation stack.

My question is: What is the best way to handle both situations without having to write 2 separate, but mostly identical view controllers?

I thought about creating a "ModalFormController" which encapsulates the bare "FormController" through composition and adds a toolbar, but I read somewhere in the docs that Apple doesn't recommend nesting view controllers.

like image 599
Sam Avatar asked Oct 30 '09 23:10

Sam


2 Answers

Why not use subclassing? Make ModalCreateFormController a subclass of EditFormController and handle the modal-specific stuff in the subclass.

like image 141
Ole Begemann Avatar answered Nov 15 '22 18:11

Ole Begemann


What I do (sometimes) is set up an enum that specifies the type of the view controller.

For example, you might have two types: an Edit type, and an Add ("new") type.

The Add type is implemented via a modal view controller, while the Edit type is pushed onto an existing navigation stack.

In the view controller's -viewDidLoad: method, I simply do a switch/case tree that sets up the title and other appearance characteristics depending on the type enumeration specified above.

The nice thing about this is that it is easy to add a new type. The downside is that the conditional tree for handing this enumeration can get complicated quickly, depending on how different the types are.

But the switch/case tree makes it a lot easier to manage.

So, it depends on what you're trying to do with the two types. But it's definitely doable.

like image 2
Alex Reynolds Avatar answered Nov 15 '22 17:11

Alex Reynolds