I need to pop up a quick dialog for the user to select one option in a UITableView from a list of roughly 2-5 items. Dialog will be modal and only take up about 1/2 of screen. I go back and forth between how to handle this. Should I subclass UIView
and make it a UITableViewDelegate
& DataSource
?
I'd also prefer to lay out this view in IB. So to display I'd do something like this from my view controller (assume I have a property in my view controller for DialogView *myDialog;
)
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"DialogView" owner:myDialog options:nil];
myDialog = [nibViews objectAtIndex:0];
[self.view addSubview:myDialog];
problem is i'm trying to pass owner:myDialog which is nil as it hasn't been instantiated...i could pass owner:self but that would make my view controller the File's Owner
and that's not how that dialog view is wired in IB.
So that leads me to think this dialog wants to be another full blown UIViewController
... But, from all I've read you should only have ONE UIViewController per screen so this confuses me because I could benefit from viewDidLoad
, etc. that come along with view controllers...
Can someone please straighten this out for me?
There is no such thing as a view controller being on the screen; its
view
is on the screen. With that said, you can present as many views as you want on the screen at once.I would create a new view and view controller. You would not make a
UIView
be aUITableViewDelegate
, you make aUIViewController
be aUITableViewDelegate
. But instead of doing that manually, instead make your new view controller a subclass ofUITableViewController
, if you're using iPhone OS 3.x+. You can then present this view controller modally.You probably want to give the user a chance to cancel out of the selection. A good way to do that is to wrap your new dialog view controller in a
UINavigationController
and then put a "Cancel" button in the nav bar. Then use the delegate pattern to inform the parent view controller that the user has made their choice so you can pop the stack.Here's what the code will look like inside your parent view controller, when you want to present this option dialog:
Your OptionViewController .h will look like this:
Your OptionViewController.m will have something like this:
Which has a matching method back in your original view controller like:
There are plenty of examples throughout Apple's sample source code that follow this general pattern.