[iOS]Swift-懒加载

最近想学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效果啊


[iOS]Swift-懒加载_第1张图片
效果图

然后反复的检查代码,完全想不通哪里出了问题,反复写了好多遍,折腾了两个多小时,才找到问题。原来是没有使用懒加载,以至于每次调用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

}()


[iOS]Swift-懒加载_第2张图片
期望的效果图

总结:

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

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

你可能感兴趣的:([iOS]Swift-懒加载)