以编程方式将视图控制器分配给标签栏控制器

时间:2016-01-13 23:35:13

标签: swift uitabbarcontroller appdelegate uitabbaritem uicontainerview

我对swift很新,我正在尝试使用Apiary的TMDB创建一个电影数据库应用程序。

我为一个类别创建了视图控制器的布局。但是,我计划有多个类别,但它们之间唯一的区别是我从API检索的数据。例如" now_playing" key获取正在播放的列表和" top_rated" key获得最受好评的电影列表。当我最初这样做时,我在AppDelegate.swift中创建了标签栏控制器,并通过使用方法instantiateViewControllerWithIdentifier以编程方式从故事板中获取它们来添加ViewControllers。最后我通过这样做将TabBarController的视图控制器设置为两个ViewControllers:tabBarController.viewControllers = [nowPlayingNavigationController, topRatedNavigationController]

这很好用。后来为了添加自定义功能,我尝试使用容器视图创建一个滑出菜单。 Story board for root View Controller and Menu which is a ViewController with a tableview inside of it.

此时我无法将以编程方式创建的Tab Bar Controller嵌入到ContainerViewController右侧的大容器视图中。由于我无法弄清楚如何以编程方式执行此操作,我尝试在main.storyboard中创建一个TabBarController,并为其提供了StoryboardID,并尝试将其设置为AppDelegate.swift中的变量TabBarController。

Tried embedding TabBarController in container

var tabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController

稍后当我尝试修改TabBar并将之前创建的ViewControllers分配给TabBarController时,它根本不起作用。

tabBarController.viewControllers = [nowPlayingNavigationController, topRatedNavigationController]
tabBarController.tabBar.barStyle = .Black
tabBarController.tabBar.tintColor = UIColor.orangeColor()

我不确定为什么这不起作用请帮助我。

Simulated Application, the TabBarController is not updating from the code in AppDelegate.swift

AppDelegate.Swift didFinishLaunchingWithOptions函数供参考

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

    //window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let nowPlayingNavigationController = storyboard.instantiateViewControllerWithIdentifier("FlicksNavigationController") as! UINavigationController
    let nowPlayingViewController = nowPlayingNavigationController.topViewController as! MoviesViewController
    nowPlayingViewController.endpoint = "now_playing"
    nowPlayingNavigationController.tabBarItem.title = "Now Playing"
    nowPlayingNavigationController.tabBarItem.image = UIImage(named: "popular")
    nowPlayingNavigationController.navigationBar.barStyle = .BlackTranslucent

    let topRatedNavigationController = storyboard.instantiateViewControllerWithIdentifier("FlicksNavigationController") as! UINavigationController
    let topRatedViewController = topRatedNavigationController.topViewController as! MoviesViewController
    topRatedViewController.endpoint = "top_rated"
    topRatedNavigationController.tabBarItem.title = "Top Rated"
    topRatedNavigationController.tabBarItem.image = UIImage(named: "topRated")

    topRatedNavigationController.navigationBar.barStyle = .BlackTranslucent



    var tabBarController = storyboard.instantiateViewControllerWithIdentifier("TabBarController") as! UITabBarController

    //tabBarController.viewControllers = [nowPlayingNavigationController, topRatedNavigationController]
    tabBarController.tabBar.barStyle = .Black
    tabBarController.tabBar.tintColor = UIColor.orangeColor()



    //let containerViewController = storyboard.instantiateViewControllerWithIdentifier("ContainerViewController") as! ContainerViewController
    //let mainContainerView = containerViewController.mainContainerView

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


    return true
}

1 个答案:

答案 0 :(得分:1)

我最初不知道如何解决这个问题,但有人帮我解决了问题,现在我开始工作了。

而不是在AppDelegate.swift中控制TabBarController,它必须在ContainerViewController.swift中完成,它应该在prepareForSegue方法中完成。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    if segue.destinationViewController.isKindOfClass(UITabBarController) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let nowPlayingNavigationController = storyboard.instantiateViewControllerWithIdentifier("FlicksNavigationController") as! UINavigationController
        let nowPlayingViewController = nowPlayingNavigationController.topViewController as! MoviesViewController
        nowPlayingViewController.endpoint = "now_playing"
        nowPlayingNavigationController.tabBarItem.title = "Now Playing"
        nowPlayingNavigationController.tabBarItem.image = UIImage(named: "popular")
        nowPlayingNavigationController.navigationBar.barStyle = .BlackTranslucent

        let topRatedNavigationController = storyboard.instantiateViewControllerWithIdentifier("FlicksNavigationController") as! UINavigationController
        let topRatedViewController = topRatedNavigationController.topViewController as! MoviesViewController
        topRatedViewController.endpoint = "top_rated"
        topRatedNavigationController.tabBarItem.title = "Top Rated"
        topRatedNavigationController.tabBarItem.image = UIImage(named: "topRated")

        topRatedNavigationController.navigationBar.barStyle = .BlackTranslucent



        let tabVC = segue.destinationViewController as! UITabBarController

        tabVC.viewControllers = [nowPlayingNavigationController, topRatedNavigationController]
        tabVC.tabBar.barStyle = .Black
        tabVC.tabBar.tintColor = UIColor.orangeColor()

    }
}

我认为必须这样做,因为TabBarController在StoryBoard中实例化,并且包含在ContainerViewController内部的containerView中。因此,控制它的方法将在prepareForSegue方法中,而不是在AppDelegate.swift中。