I have an app with some tabs at the bottom (UITabViewController), and most of the tabs also include a toolbar at the top.
The user needs to be logged in to access one of the tabs — let’s call it the “My Account” tab. Once they are logged in, they will either be shown their profile information, or if they haven’t set it up yet, then they’ll be shown a dialogue that explains the benefits of filling in their profile along with a big button that says “Get Started”. All three of these screens have tabs at the bottom and a toolbar at the top. So the views I’m making only take up the middle portion of the screen — therefore they need to be loaded as subviews. In essence, I’m trying to display one of three different subviews based on the user’s current state, and I need to be able to switch these subviews with one another whenever the user’s state changes (such as when they log in).
I originally created three separate “layers” for these subviews and just used setHidden to switch between them, but that has the big disadvantage of initializing all 3 views regardless of which ones are being used. I’m also not sure how to animate the transition when I’m just hiding/unhiding them.
Ideally, I would like to create three separate nib files (one for each view) that share the same viewcontroller (the parent controller), and just load them in dynamically based on the user’s state. So if the user is not logged in, I’ll load in the “Login” nib and then use addSubView to add it to the screen. When the user logs in, then I can load one of the other nibs as a subview and then use an animation to switch out the subviews.
The problem I’m having is that all three of the subviews are simple enough that I just want to keep the logic for handling their button clicks within the top level view controller (the “MyAccountViewController”). For example, I would like to be able to handle the click event of the “login” button within the same view controller that is responsible for displaying the user’s profile information. I don’t want to have to create a separate view controller for each of the subviews.
This is what I’m currently doing:
- (void)showLoginView {
UIView *loginView = [[[NSBundle mainBundle] loadNibNamed:@"Login" owner:self options:nil] objectAtIndex:0];
[self.view addSubview:loginView];
}
It just crashes on the “addSubview” line with EXC_BAD_ADDRESS. By the way it is behaving, it seems to be running out of memory, possibly due to an infinite loop or something. I have a feeling I’m WAY OFF on the solution here.
Is what I’m trying to do possible?
I would also be interested in learning about any best practices for handling login screens. I’ve been having a lot of trouble figuring out the best workflow for an iPhone app. I’m used to writing web apps (and yes, a login is necessary — this app is tied to a website).
Thanks!
EDIT: I’ve considered writing a separate view controller for each of the subview nibs. These view controllers would handle the button clicks within their respective nibs and then use objective-C’s delegate feature to propagate the event up to the parent view controller, but that’s a lot of extra code I’d like to avoid if possible.
If you haven’t already, I’d double check your connections in that nib and NSLog the class of the var at index 0 to make absolutely sure it is a UIView.
My advice: scrap the nibs. If you can’t do it in code, why even bother? I only use nibs as a layout tool, and never package them with a binary. Just make UIView subclasses instead and save yourself time, memory, code, and storage space.
As for your login screen idea troubles, when I’m stuck, I visit the Mobile Design Patterns Gallery for inspiration. If you would like a more… -Expert shall we say- opinion, visit SO’s visual cousin ux.stackexchange.com