以编程方式创建选项卡栏控制器项时获取 'Unexpectedly found nil' 值

Getting 'Unexpectedly found nil' value while creating TabBar Controller items Programatically

我是 swift 的新手。我正在使用 TabBar 控制器。我已经使用故事板设置了 Tabbar 控制器和视图控制器。但出于某些设计目的,我需要以编程方式添加选项卡栏项目。当我 运行 此代码崩溃时,我的网点声明了 'Unexpectedly found nil' 值。我错过了什么吗?

提前致谢..

这是我的代码,

class TabbarController: UITabBarController,UITabBarControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        tabBar.tintColor = UIColor.white
        tabBarItem.title = ""

        setTabBarItems()
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController)
    {
       // print("hi", terminator: "")
    }

    func setTabBarItems(){

        let v1 = MyOrderViewController()

        v1.tabBarItem.image = UIImage(named: "footer_1")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v1.tabBarItem.selectedImage = UIImage(named: "footer_1")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v1.tabBarItem.title = "Orders"
        v1.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)

        let v2 = FavouritesViewController()

        v2.tabBarItem.image = UIImage(named: "footer_2")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v2.tabBarItem.selectedImage = UIImage(named: "footer_2")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v2.tabBarItem.title = "Favorites"
        v2.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)


        let v3 = FavouritesViewController()

        v3.tabBarItem.image = UIImage(named: "huggg")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
        v3.tabBarItem.selectedImage = UIImage(named: "huggg")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal)
        v3.tabBarItem.title = ""
        v3.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)


        let v4 = MoreViewController()

        v4.tabBarItem.image = UIImage(named: "footer_4")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v4.tabBarItem.selectedImage = UIImage(named: "footer_4")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v4.tabBarItem.title = "Account"
        v4.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)


        let v5 = MoreViewController()

        v5.tabBarItem.image = UIImage(named: "footer_5")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v5.tabBarItem.selectedImage = UIImage(named: "footer_5")?.withRenderingMode(UIImage.RenderingMode.alwaysTemplate)
        v5.tabBarItem.title = "More"
        v5.tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)

        let controllers = [v1, v2, v3, v4, v5]
        self.viewControllers = controllers
    }
}

您出现问题的原因是您没有将 ViewControllers 类 与情节提要视图联系起来,因此编译器无法实例化插座。

不要使用控制器的 init 方法,而是使用 UIStoryboard 方法 instantiateViewController(withIdentifier:)

首先创建故事板

UIStoryboard(name: <storyboard_name>, bundle: nil)

比使用它的标识符实例化适当的 UIViewController

let controller = storyboard.instantiateViewController(withIdentifier: <your_controller_identifier>)