最近想學(xué)Swift,因為正好手上有個OC小項目,所以就打算把這個OC小項目翻譯成Swift的。
這里記錄下遇到的一些問題,萬一有一天有人也踩到這種坑呢?
今天需要用到UITabBarController,一開始也以為這種控件還不分分鐘就能寫好,然而我錯了。
思路
創(chuàng)建一個XBMainViewController,然后在XBMainViewController中創(chuàng)建一個類型為UITabBarController的屬性tabBarController,然后生成并設(shè)置好tabBarController.viewControllers,嗯,就是這樣,覺得30分鐘搞定,美滋滋。
那么先申明tabBarController吧,于是代碼如下"var tabBarController: UITabBarController?",然后得到一個這樣的錯誤“Cannot override with a stored property 'tabBarController'”,真是巧了,隨便命個名,竟然跟蘋果粑粑的系統(tǒng)自帶屬性重名了。(我其實是在夸自己,怕你們get不到,哈哈)
好吧,既然系統(tǒng)有這個屬性,那就直接用吧!于是我就去研究了下如何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)!)
???? //構(gòu)建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效果啊

然后反復(fù)的檢查代碼,完全想不通哪里出了問題,反復(fù)寫了好多遍,折騰了兩個多小時,才找到問題。原來是沒有使用懶加載,以至于每次調(diào)用self.tabBarController都會重新生成一個新的tabBarController
解決方案如下:
//第一種(override 系統(tǒng)自帶屬性,定義一個中間變量實現(xiàn)懶加載)
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
}()

總結(jié):
這么點代碼,遇到問題,很郁悶,甚至堅信自己的代碼沒問題,然后折騰了很久之后才靜下心來調(diào)試,其實打個斷點po self.tabBarController.viewControllers就能發(fā)現(xiàn)問題了。
btw,遇到問題不要慌,實在不行抽支煙冷靜一下。