Создание UITabBarController и UINavigationController программно Swift 4 - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь сделать UITabBarController и UINavigationController программно.Я перепробовал много уроков, но большинство использует Swift 3, который слишком устарел и не работает.

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 = JournalTableViewController()
    let navController = UINavigationController(rootViewController: journalVC)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true
}

JournalTableViewController.swift Фрагмент:

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)

}

Что работает:

  • Сборка загружается на симулятор

Что не работает:

  • Сборка падает после загрузки на симулятор

  • После сбоя ошибка Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee6c2ada8) по этой строке 12 из JournalTableViewController.swift Фрагмент

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если вы собираетесь объединить UITabBarController и UINavigationController, то вам нужно, чтобы контроллер панели вкладок был контроллером корневого представления.При необходимости каждая вкладка может иметь свой собственный контроллер навигации.

Если вы сделаете контроллер навигации корневым, то, как только вы нажмете новый контроллер представления, панель вкладок исчезнет.Сделав панель вкладок корневым, вы можете иметь ряд навигационных иерархий и быстро переключаться между ними с помощью кнопок вкладок.

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()
    journalVC.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)
    tabBarController.viewControllers = [journalVC]

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

    return true
}

Нет необходимости в каком-либо определенном коде в классе контроллера представления.

JournalTableViewController.swift Фрагмент:

override func viewDidLoad() {
    super.viewDidLoad()
}
0 голосов
/ 28 октября 2018

Я думаю, что в вашем фрагменте есть опечатка.В следующем коде мы добавили промежуточный vc для решения рекурсивных задач.

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
}

Вот журнал 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)

  }

 }

, тогда как tableviewcontroller должен выглядеть следующим образом:

class JournalTableViewController: UITableViewController{


 }
...