以编程方式将视图控制器分配给选项卡栏控制器 [英] Programmatically assign view controller to tab bar controller

查看:87
本文介绍了以编程方式将视图控制器分配给选项卡栏控制器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新手,我正在尝试使用Apiary的TMDB创建电影数据库应用程序.

I am fairly new to swift and am trying to create a movie database application using TMDB from Apiary.

我为一个类别创建了视图控制器的布局.但是,我计划有多个类别,但它们之间的唯一区别是我从API检索的数据.例如,"now_playing"键获取当前播放列表,而"top_rated"键获取电影评分最高的列表.最初执行此操作时,我在AppDelegate.swift中创建了标签栏控制器,并通过使用stantiateViewControllerWithIdentifier方法从情节提要中以编程方式将其添加到视图控制器中.最后,我通过执行以下操作将TabBarController的视图控制器设置为两个ViewController: tabBarController.viewControllers = [nowPlayingNavigationController,topRatedNavigationController]

I have created the layout of the view controllers for one category. However, I am planning to have multiple categories, the but only difference between them is the data I retrieve from the API. For example "now_playing" key gets the now playing list and the "top_rated" key gets the top rated list of movies. When I was initially doing this I created the tab bar controller in AppDelegate.swift and added the ViewControllers to it by getting them programmatically from the storyboard with the method instantiateViewControllerWithIdentifier. Then finally the I set the TabBarController's view controllers to the two ViewControllers by doing this: tabBarController.viewControllers = [nowPlayingNavigationController, topRatedNavigationController]

这很好.后来为了增加可定制性,我尝试使用容器视图创建一个滑出菜单.

This was working fine. Later to add customizability I tried creating a slide out menu using container views.

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

At this point I was unable to embed the programmatically created Tab Bar Controller into the large container view on the right side of the ContainerViewController. Since I could not figure out how to programmatically do this, I attempted to create a TabBarController in main.storyboard and gave it a StoryboardID and tried setting it to a variable TabBarController in AppDelegate.swift.

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

后来,当我尝试修改TabBar并将先前创建的ViewController分配给TabBarController时,它根本不起作用.

later when I try to modify the TabBar and assign the previously created ViewControllers to the TabBarController it simply does not work.

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

我不确定为什么这行不通,请帮帮我.

I am not sure why this isn't working please help me out.

AppDelegate.Swift didFinishLaunchingWithOptions函数以供参考

AppDelegate.Swift didFinishLaunchingWithOptions function for reference

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
}

推荐答案

我最初不知道如何解决此问题,但有人帮助了我,现在我开始解决了.

I initially had no idea of how to fix this problem but someone helped me out and now I got it working.

与其在AppDelegate.swift中控制TabBarController,不如在ContainerViewController.swift中完成它,而应在prepareForSegue方法中完成.

Instead of controlling the TabBarController in the AppDelegate.swift it has to be done in ContainerViewController.swift and it should be done in the prepareForSegue method.

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中.

I believe this has to be done since the TabBarController is instantiated in StoryBoard and is contained in a containerView that is inside of the ContainerViewController. So, the way to control it would be inside the prepareForSegue method rather than in AppDelegate.swift.

这篇关于以编程方式将视图控制器分配给选项卡栏控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆