MirrorJacket123
MirrorJacket123

Reputation: 432

Making a UITabBarController and UINavigationController Programmatically Swift 4

I am trying to make a UITabBarController and a UINavigationController programmatically. I've tried many tutorials but most use Swift 3 which is too outdated and doesn't work.

AppDelegate.swift Snippet:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)
    let journalVC = JournalTableViewController()
    let navController = UINavigationController(rootViewController: journalVC)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true
}

JournalTableViewController.swift Snippet:

var tabBarCnt = UITabBarController()

override func viewDidLoad() {
    super.viewDidLoad()

    tabBarCnt = UITabBarController()
    tabBarCnt.tabBar.barStyle = .black

    let journalVC = JournalTableViewController()
    journalVC.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)

    tabBarCnt.viewControllers = [journalVC]
    self.view.addSubview(tabBarCnt.view)

}

What works:

What doesn't work:

Upvotes: 1

Views: 6084

Answers (2)

Paulw11
Paulw11

Reputation: 114826

If you are going to combine a UITabBarController and a UINavigationController then you will want the tab bar controller to be the root view controller. Each tab can have its own navigation controller if required.

If you make the navigation controller the root, then as soon as you push a new view controller, the tab bar will disappear. By making the tab bar the root, you can have a series of navigation hierarchies and switch quickly between them using the tab buttons.

AppDelegate.swift

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)

    let journalVC = JournalViewController()
    let navController = UINavigationController(rootViewController: journalVC)

    let tabBarController = UITabBarController()
    navController.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)
    tabBarController.viewControllers = [navController]

    window?.rootViewController = tabBarController
    window?.makeKeyAndVisible()

    return true
}

There is no need for any specific code in your view controller class.

JournalTableViewController.swift Snippet:

override func viewDidLoad() {
    super.viewDidLoad()
}

Upvotes: 2

E.Coms
E.Coms

Reputation: 11531

I think there is a typo in your snippet. In the following code, we added an intermediate vc to solve recursive problems.

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

window = UIWindow(frame: UIScreen.main.bounds)
let journalVC = JournalViewController()
let navController = UINavigationController(rootViewController: journalVC)
window?.rootViewController = navController
window?.makeKeyAndVisible()

return true
}

Here is journal vc:

class JournalViewController: UIViewController{

var tabBarCnt = UITabBarController()

override func viewDidLoad() {
    super.viewDidLoad()

    tabBarCnt = UITabBarController()
    tabBarCnt.tabBar.barStyle = .black

    let journalVC = JournalTableViewController()
    journalVC.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)

    tabBarCnt.viewControllers = [journalVC]
    self.view.addSubview(tabBarCnt.view)

  }

 }

while the tableviewcontroller should be like this:

class JournalTableViewController: UITableViewController{


 }

Upvotes: 0

Related Questions