最近想学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,遇到问题不要慌,实在不行抽支烟冷静一下。