[iOS]Swift-懶加載

最近想學(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,遇到問題不要慌,實在不行抽支煙冷靜一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,726評論 1 14
  • 前言 最近忙完項目比較閑,想寫一篇博客來分享一些自學(xué)iOS的心得體會,希望對迷茫的你有所幫助。博主非科班出身,一些...
    GitHubPorter閱讀 1,582評論 9 5
  • 哦吼吼,又研究了幾天,把FMDB這個封裝好的數(shù)據(jù)庫搞定了,寫了個簡單的例子,基于FMDB的添刪改查操作,界面很一般...
    lichengjin閱讀 662評論 0 0
  • 前言 很多時候,系統(tǒng)原生的 UITabBar 并不能滿足我們的需求,譬如我們想要給圖標(biāo)做動態(tài)的改變,或者比較炫一點...
    四月_Hsu閱讀 5,163評論 1 6
  • javaEE:架構(gòu) javaSE:java基礎(chǔ) ejb:javaEE的一部分 關(guān)鍵字:由sun公司定義,有意義的單...
    DJ_2017閱讀 309評論 0 0

友情鏈接更多精彩內(nèi)容