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

问题描述

我是 swift 的新手,正在尝试使用 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 中创建了标签栏控制器,并通过使用方法 instantiateViewControllerWithIdentifier 以编程方式从情节提要中获取它们,将它们添加到其中.最后,我通过这样做将 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 并将之前创建的 ViewControllers 分配给 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.

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

08-05 11:58