2017-01-20 10 views
0

У меня есть приложение, но используя файл XIB, так что если добавить этот код в приложение делегата для создания панели вкладок контроллерСоздать панель вкладок контроллер и контроллер навигации

let tabBarController = UITabBarController() 
    let tabViewController1 = DummyViewController(
     nibName: "DummyViewController", 
     bundle: nil) 
    let tabViewController2 = SearchViewController(
     nibName:"SearchViewController", 
     bundle: nil) 

    tabViewController1.tabBarItem = UITabBarItem(
     title: "Location", 
     image: UIImage(named: "ic_location_blue"), 
     tag: 1) 
    tabViewController2.tabBarItem = UITabBarItem(
     title: "Search", 
     image:UIImage(named: "ic_search_blue") , 
     tag:2) 


    let controllers = [tabViewController1,tabViewController2] 
    tabBarController.viewControllers = controllers 
    window?.rootViewController = tabBarController 

и этот код, чтобы создать Навигационный контроллер

let viewController = SearchViewController(nibName: nil, bundle: nil) 
    let navigationController = UINavigationController(rootViewController: viewController) 

    self.window = UIWindow(frame: UIScreen.main.bounds) 
    self.window?.rootViewController = navigationController 
    self.window?.makeKeyAndVisible() 

не может, потому что я добавляю self.window?.rootViewController = navigationController и window?.rootViewController = tabBarController вместе. То, что я хочу что-то вроде этого:

enter image description here

, но в коде, я требую навигационного контроллера нажать вид контроллер.

ответ

0

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

//this will hold the root 
    var rootController: UIViewController! 

    @UIApplicationMain 
    class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 
//modify didFinishLaunchingWithOptions in your app delegate as follows 
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    // Override point for customization after application launch. 

    let tabController = UITabBarController() 

    //setup a view controller from another storyboard 
    let workoutsStoryboard = UIStoryboard(name: "Workouts", bundle: nil) 

    //this tab will start from a storyboard of its own 
    let homeVC = workoutsStoryboard.instantiateViewController(withIdentifier: "home") as! HomeViewController 

    //this will setup another tab bar but from a view controller only if you want to setup things programmatically 
    let profileVC = ProfileViewController() 


    //setup the tab bar elements with the icons, name and initial view controllers 
    let vcData: [(UIViewController, UIImage, String)] = [ 
     (homeVC, UIImage(named: "home_tabbar_icon")!, "Home"), 
     (profileVC, UIImage(named: "feed_tabbar_icon")!, "Profile") 
    ] 

    let vcs = vcData.map { (vc, image, title) -> UINavigationController in 
     let nav = UINavigationController(rootViewController: vc) 
     nav.tabBarItem.image = image 
     nav.title = title 
     return nav 
    } 

    //customize your tab bar 
    tabController.viewControllers = vcs 

    tabController.tabBar.barTintColor = UIColor(hexString: "#FAFAFA") 

    tabController.tabBar.tintColor = UIColor(hexString: "#4A4A4A") 

    tabController.tabBar.isTranslucent = false 


    if let items = tabController.tabBar.items { 
     for item in items { 
      if let image = item.image { 

       item.image = image.withRenderingMode(UIImageRenderingMode.alwaysOriginal) 
      } 
     } 
    } 

    //make your tab bar the root 
    window?.rootViewController = tabController 


    //tab bar comes with a nav bar. here is how to customize it 
    UIApplication.shared.statusBarStyle = .lightContent 

    UINavigationBar.appearance().shadowImage = UIImage() 

    UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default) 

    UINavigationBar.appearance().isTranslucent = false 

    UINavigationBar.appearance().tintColor = UIColor.white 

    UINavigationBar.appearance().backgroundColor = UIColor.white 

    UINavigationBar.appearance().barTintColor = UIColor(hexString: "#4A90E2") 



    rootController = (window?.rootViewController)! 

    return true 
} 

Если вы задаетесь вопросом, как настроить раскадровка из дома в приведенном выше примере все, что вам нужно сделать, это зайти в New-> File и выберите раскадровки. Позвоните в раскадровку «Домой», и когда она войдет в ваш проект, выберите ее, а в «Файловом инспекторе» запишите свое имя «Home.storyboard».

Home storyboard

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

Home Nav Controller

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

0

Под didFinishLaunchingWithOptions написать следующий код: -

// Создать вкладку Контроллер

let tabBarController = UITabBarController() 
    let tabViewController1 = DummyViewController(
     nibName: "DummyViewController", 
     bundle: nil) 
    let tabViewController2 = SearchViewController(
     nibName:"SearchViewController", 
     bundle: nil) 

    tabViewController1.tabBarItem = UITabBarItem(
     title: "Location", 
     image: UIImage(named: "ic_location_blue"), 
     tag: 1) 
    tabViewController2.tabBarItem = UITabBarItem(
     title: "Search", 
     image:UIImage(named: "ic_search_blue") , 
     tag:2) 


    let controllers = [tabViewController1,tabViewController2] 
    tabBarController.viewControllers = controllers 
//Create navigation controller 
let navigationController = UINavigationController(rootViewController: tabBarController) 

    self.window = UIWindow(frame: UIScreen.main.bounds) 
    self.window?.rootViewController = navigationController//Set navigation controller as window's root view 
    self.window?.makeKeyAndVisible() 
+0

FYI, В случае приведенный выше код не работает в соответствии с вашими требованиями, а затем положить 'DummyViewController' и' SearchViewController 'в отдельных навигационных контроллерах (скажем tabNAVViewController1, tabNavViewController2). А затем 'let controllers = [tabNAVViewController1, tabNavViewController2]' – pkc456