Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making a button persistent across all view controllers

I want to have a persistent button in the bottom right corner of my app. During all view transitions, the button should remain static. I'm having trouble deciding what view to add the button to. I know the button ought to be stored in the AppDelegate, but I don't know what other view it would be sense to add it to except the window. One downside of adding it to the window is that when there's an app running in the background (ie Phone), the added status bar padding will push down the window. In general, adding it to the window seems to be a hacky solution -- any thoughts?

like image 436
D-Nice Avatar asked Jul 20 '13 03:07

D-Nice


People also ask

How do I create a segue between view controllers?

To create a segue between view controllers in the same storyboard file, Control-click an appropriate element in the first view controller and drag to the target view controller. The starting point of a segue must be a view or object with a defined action, such as a control, bar button item, or gesture recognizer.

What is a container view controller?

Container view controllers are a way to combine the content from multiple view controllers into a single user interface. Container view controllers are most often used to facilitate navigation and to create new user interface types based on existing content.


2 Answers

Yes, adding it to the UIWindow would be extremely hacky and finicky.

Storyboards

If you're using Storyboards and iOS 5.0 onwards, you should be able to use container views and do something like this:

MAH BUTTON IS PLEASED

Here's another picture showing the, rather simplistic, structure of the first View Controller:

enter image description here

The view controller on the left has a container, and then a view which holds the button on top of it. The container indicates that the navigation controller (directly to the right) should appear within itself, that relationship is shown by the =([])=> arrow (formally known as an embed segue). Finally the navigation controller defines its root view controller to the one on the right.

In summary, the first view controller pancakes-in the container view with the button on top, so everything that happens inside has to have the button on top.

Using childViewControllers

aka. The "I hate Storyboards and puppies" mode

Using a similar structure to the Storyboard version, you could create the base view controller with its button, and then, add the view that will become then new "root" of the application, underneath.

To make it clear, let's call the one view controller that holds the button the FakeRootViewController, and the view controller that will be, for all practical purposes, the root of the application: RootViewController. All subsequent view controllers won't even know that there's the FakeRootViewController above everyone else.

FakeRootViewController.m

// The "real" root #import "RootViewController.h"  // Call once after the view has been set up (either through nib or coded). - (void)setupRootViewController {     // Instantiate what will become the new root     RootViewController *root = [[RootViewController alloc] <#initWith...#>];      // Create the Navigation Controller     UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:root];      // Add its view beneath all ours (including the button we made)     [self addChildViewController:nav];     [self.view insertSubview:nav.view atIndex:0];     [nav didMoveToParentViewController:self]; } 

AppDelegate.m

#import "FakeRootViewController.h"  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];      FakeRootViewController *fakeRoot = [[FakeRootViewController alloc] <#initWith...#>];      self.window.rootViewController = fakeRoot;     [self.window makeKeyAndVisible];      return YES; } 

That way, you can have all the benefits of inserting the button on the window, without all the guilt and "Should I really be a programmer?" that it causes.

like image 198
Can Avatar answered Nov 29 '22 05:11

Can


Potentially you could have 1 main "root" view controller, and all you other view controllers could be child view controllers, with their views as child views. Then they would have their content, and the button would be in the "root" view controller. But this seems just as sketchy and hacky as putting it in the window, and probably less convenient.

like image 40
tootsiejasmine Avatar answered Nov 29 '22 05:11

tootsiejasmine