美文网首页
[iOS]Swift-懒加载

[iOS]Swift-懒加载

作者: 我不是小兵 | 来源:发表于2017-10-10 18:50 被阅读0次

    最近想学Swift,因为正好手上有个OC小项目,所以就打算把这个OC小项目翻译成Swift的。

    这里记录下遇到的一些问题,万一有一天有人也踩到这种坑呢?

    今天需要用到UITabBarController,一开始也以为这种控件还不分分钟就能写好,然而我错了。

    思路

    创建一个XBMainViewController,然后在XBMainViewController中创建一个类型为UITabBarController的属性tabBarController,然后生成并设置好tabBarController.viewControllers,嗯,就是这样,觉得30分钟搞定,美滋滋。

    那么先申明tabBarController吧,于是代码如下"var tabBarController: UITabBarController?",然后得到一个这样的错误“Cannot override with a stored property 'tabBarController'”,真是巧了,随便命个名,竟然跟苹果粑粑的系统自带属性重名了。(我其实是在夸自己,怕你们get不到,哈哈)

    好吧,既然系统有这个属性,那就直接用吧!于是我就去研究了下如何override属性。

    代码如下:


    override var tabBarController: UITabBarController!{

    get{

    let temTabBarController : UITabBarController = UITabBarController()

    temTabBarController.delegate = self

    temTabBarController.tabBar.barStyle = UIBarStyle.black

    return temTabBarController

    }

    }


    so easy,美滋滋。

    然后override func viewDidLoad(),代码如下:


    override func viewDidLoad() {

           super.viewDidLoad()

           //添加tabBarController

          self.addChildViewController(self.tabBarController!)

          self.view .addSubview((self.tabBarController?.view)!)

         //构建tabBarController subViewControllers

         let chartVC = XBNavigationViewController.init(rootViewController: XBChartsViewController())

         chartVC.view.backgroundColor = UIColor.red

         chartVC.tabBarItem = self.tabBarItemInstance(title: "啊啊啊", imageName: "homepage_tab_btn_feeds")

         let recordVC = XBNavigationViewController.init(rootViewController: XBRecordViewController())

         recordVC.view.backgroundColor = UIColor.red

         recordVC.tabBarItem = self.tabBarItemInstance(title: "哦哦哦", imageName: "homepage_tab_btn_homepage")

         let settingsVC = XBNavigationViewController.init(rootViewController: XBSettingsViewController())

        settingsVC.tabBarItem = self.tabBarItemInstance(title: "呃呃呃", imageName:   "homepage_tab_btn_my")

        self.tabBarController.setViewControllers([chartVC,recordVC,settingsVC], animated: true)

        self.tabBarController.selectedIndex = 1;

    }


    func tabBarItemInstance(title:String ,imageName:String) -> UITabBarItem {

    let tabBarItem : UITabBarItem = UITabBarItem.init(title: title, image: UIImage.originImage(imageName:"\(imageName)_n"), selectedImage: UIImage.originImage(imageName: "\(imageName)_p"))

    var insert : UIEdgeInsets = UIEdgeInsets.init(top: -2, left: 0, bottom: 2, right: 0)

    if title == "0" {

    insert = UIEdgeInsets.init(top: -6, left: 0, bottom: 6, right: 0)

    }

    let offSet : UIOffset = UIOffset.init(horizontal: 0, vertical: -4)

    tabBarItem.title = title

    tabBarItem.imageInsets = insert

    tabBarItem.titlePositionAdjustment = offSet

    return tabBarItem

    }


    此时代码写好了,一气呵成,妙不可言啊,随手command+R,然后就懵逼了。这根本就不是我要的UITabBarController效果啊

    效果图

    然后反复的检查代码,完全想不通哪里出了问题,反复写了好多遍,折腾了两个多小时,才找到问题。原来是没有使用懒加载,以至于每次调用self.tabBarController都会重新生成一个新的tabBarController

    解决方案如下:

    //第一种(override 系统自带属性,定义一个中间变量实现懒加载)

    private var _tabBarController : UITabBarController?

    override var tabBarController: UITabBarController{

    return _tabBarController ?? {

    let temTabBarController = UITabBarController()

    temTabBarController.delegate = self

    temTabBarController.tabBar.barStyle = UIBarStyle.black

    temTabBarController.view.backgroundColor = UIColor.red

    _tabBarController = temTabBarController

    return temTabBarController

    }()

    }

    //第二种(自定义一个tabBarController,使用懒加载的方式)

    lazy var _tabBarController : UITabBarController = {

    let temTabBarController = UITabBarController()

    temTabBarController.delegate = self

    temTabBarController.tabBar.barStyle = UIBarStyle.black

    print("nnnnnnnnnnn")

    return temTabBarController

    }()

    期望的效果图

    总结:

    这么点代码,遇到问题,很郁闷,甚至坚信自己的代码没问题,然后折腾了很久之后才静下心来调试,其实打个断点po self.tabBarController.viewControllers就能发现问题了。

    btw,遇到问题不要慌,实在不行抽支烟冷静一下。

    相关文章

      网友评论

          本文标题:[iOS]Swift-懒加载

          本文链接:https://www.haomeiwen.com/subject/ygdbyxtx.html