Creating a navigationController programmatically (Swift)
IosSwiftUinavigationcontrollerIos Problem Overview
I've been trying to redo the work on my app programmatically. (Without the use of storyboards)
I'm almost done, except making the navigation controller manually.
I've been doing some research but I can't find any documentation of implementing this manually. (I started making the app as a Single View Application)
Currently, I only have 1 viewcontroller. And of course the appDelegate
The navigation Controller, will be used throughout all pages in the application.
If anyone could help me out, or send a link to some proper documentation for doing this programmatically it would be greatly appreciated.
EDIT:
I forgot to mention it's in Swift.
Ios Solutions
Solution 1 - Ios
Swift 1, 2:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
var nav1 = UINavigationController()
var mainView = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller
nav1.viewControllers = [mainView]
self.window!.rootViewController = nav1
self.window?.makeKeyAndVisible()
}
Swift 4+: and Swift 5+
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
let nav1 = UINavigationController()
let mainView = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller
nav1.viewControllers = [mainView]
self.window!.rootViewController = nav1
self.window?.makeKeyAndVisible()
}
Solution 2 - Ios
For those building newer projects with SceneDelegate.swift, you can use the 'var window: UIWindow?' in SceneDelegate instead of the removed 'var window' in AppDelegate Value of type 'AppDelegate' has no member 'window'
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window?.windowScene = windowScene
window?.makeKeyAndVisible()
let viewController = ViewController()
let navViewController = UINavigationController(rootViewController: viewController)
window?.rootViewController = navViewController
}
Solution 3 - Ios
I would recommend starting your AppDelegate with this skeleton:
-
use let wherever you can!
-
UINavigationController has the rootViewController property.
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let viewController = ViewController(nibName: nil, bundle: nil) //ViewController = Name of your controller let navigationController = UINavigationController(rootViewController: viewController)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window?.rootViewController = navigationController self.window?.makeKeyAndVisible() return true
}
Solution 4 - Ios
Here is another take in the SceneDelegate class:
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let navController = UINavigationController()
let viewController = ViewController()
navController.viewControllers = [viewController]
window.rootViewController = navController
self.window = window
window.makeKeyAndVisible()
}
}
Solution 5 - Ios
Try this one . It will guide you how to use navigation controller.
https://stackoverflow.com/questions/22981610/programatically-creating-uinavigationcontroller-in-ios
AppDelegate.h
#import <UIKit/UIKit.h>
#import "LoginViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong,nonatomic) UINavigationController *navigationController;
@property (strong,nonatomic) LoginViewController *loginVC;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "LoginViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.loginVC = [[LoginViewController alloc]initWithNibName:nil bundle:nil];
self.loginVC.title = @"Login Page";
self.navigationController = [[UINavigationController alloc]initWithRootViewController:self.loginVC];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
}
Then when you want to push the other view controller , simple use following code to move to another view controller.
- (IBAction)pushMyProfileView:(id)sender
{
self.myProfileVC = [[MyProfileViewController alloc]initWithNibName:nil bundle:nil];
[appDelegate.navigationController pushViewController:self.myProfileVC animated:YES];
}
Solution 6 - Ios
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let storyboard_Secondary = UIStoryboard(name: "Secondary", bundle: nil)
var initialViewController = UIViewController()
let aUser = CommonMethods.loadCustomObject("\(Constants.kUserProfile)") as? User
if aUser?.respCode == 1 {
initialViewController = storyboard_Secondary.instantiateViewController(withIdentifier: "MainTabVC")
UIApplication.shared.statusBarStyle = .lightContent
let navigationController = UINavigationController(rootViewController: initialViewController)
navigationController.isNavigationBarHidden = true
self.window!.rootViewController = navigationController
self.window!.makeKeyAndVisible()
}