Reputation: 3001
I've seen a lot of other questions on here about adding a UINavigationBar
to a UIPopoverController
. All of the examples I've seen follow one of two patterns:
In the init
or viewDidLoad
method of the Popover subclass, you alloc-init a UINavigationBar
directly, as suggested here. This method is a little hacky, and while it shows up nicely, if the popover is a UITableViewController, you have to mess with a bunch of things to make sure the navigation bar you just added doesn't overlap one of your cells.
Alternatively, a lot of post suggest creating a UINavigationController
just before presenting the popover, as shown here.
With the second method, however, won't the popover be the only controller in the newly created navigation controller? And if my view that I'm presenting the popover from is itself already in a navigation controller, the popover will NOT be in that same navigation controller, correct? It seems to be that the more appropriate thing to do would be to add the popover being created as another controller in the navigation controller that already exists (and which the controller that presents the popover is already a part of). Is that possible? Or is there a reason why the navigation controller for the popover needs to be independent from the navigation controller for the presenting controller? Or am I totally missing something here?
Upvotes: 1
Views: 2534
Reputation: 16946
Adding a navigation bar to a popover isn't hacky. A navigation bar is just another regular view. That also means that using a UITableViewController
with it, the navigation bar will overlap the table view, as the UITableViewController
's view
property just returns the controller's tableView
property. If you want to add a navigation bar above a table view, without it overlapping the table view, use a regular UIViewController
and add your navigation bar and table view the normal way. UITableViewController
should only be used if your only view within that view controller is a table view.
Having said that, I do agree with others that just using a navigation controller without using its navigation features is the most common approach.
Upvotes: 0
Reputation: 33048
You have many questions, young Skywalker. :)
Creating a UINavigationController
and then embedding the controller you would like to present is the way to go.
Don't get confused by all the controllers involved here:
UIPopoverController
is a construct that shows an existing UIViewController
in an overlay like style. UIPopoverController
itself even isn't a subclass of UIViewController
. The name is misleading.UIPopoverController
hosts another controller. In your case, we let it host a UINavigationController
.UINavigationController
is a subclass of UIViewController
. It is a container controller and can handle a stack of UIViewControllers
.UIViewController
: the one you want to display and garnish with a UINavigationBar
. Since Mr. UINavigationController
comes with a build in UINavigationBar
, he's our friend.There is no need to subclass UIPopoverController
. You just keep one static reference to it around so you can dismiss the current open popover in case you want to present another.
It does not matter where you present the UIPopoverController from. It will always be a popover. Even if presented from an existing UINavigationController. Only if you use presentViewController:
you will get different results depending on the controller you're presenting from (modal or pushed on top of the stack).
Upvotes: 2
Reputation: 119031
won't the popover be the only controller in the newly created navigation controller?
No, the popover will contain the navigation controller and the navigation controller will only contain its root view controller (which would otherwise have been added directly to the popover as its root).
You seem to be a little confused about the relationship between the popover and the popover root view controller...
the popover will NOT be in that same navigation controller, correct
Yes, correct. The popover is effectively a window floating above all other views
Or am I totally missing something here?
Maybe... The popover would usually be used for displaying something modal, transient and smaller than full screen size. Putting a navigation controller in the popover and adding views to it is the normal approach.
Upvotes: 2