Making a Button Persistent Across All View Controllers

Making a button persistent across all view controllers

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:

Sample Image

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.

Same button across all view controllers in ios app

Create new subclass of view controller:

class SendFeedbackViewController: UIViewController {
@IBOutlet weak var sendFeedbackButton: UIButton!

@IBAction func sendFeedback() {
/* do whatever you need */
}
}

Then subclass all your view controllers from this new view controller:

class YourViewController: SendFeedbackViewController {
/* your entire logic */
}

In storyboard set class type:
Sample Image

Now you can connect your send feedback button outlet and action:
Sample Image
Sample Image

Adding button which should be visible in all view controllers

Try adding _yourView/button to your window... you can do this in didFinishLaunchingWithOptions also you can do [self.window bringSubviewToFront:_yourView] when required.. if you add some other view over it.



Related Topics



Leave a reply



Submit