import UIKit /* 總結:1:給UIButton寫分類,新建文件swiftFile,通常爲了區分起名字都是名字-Extension,要想調用UI控件須要導入 import UIKit框架,而後給系統的類寫分類:extension UIButton {},提供類方法或是構造函數的方法,把與該控件有關的業務邏輯全封裝在分類的內部。2:封裝方法:類方法:都是以class開頭,class func 函數名(參數)->返回值類型{業務邏輯代碼,return 返回值}:例子: class func createButton(imageName:String,backgroundImageName:String) -> UIButton {},其中聲明函數的時候,沒有參數也加(),返回值只寫類型。分類不用private和fileprivate修飾 3:構造函數方法:利用便利構造函數: convenience init(_ imageName:String,bgImageName:String) convenience爲便利構造函數,便利構造函數一般用在對系統的類進行構造函數的擴充時使用 遍歷構造函數的特色 1.遍歷構造函數一般都是寫在extension裏面 2.遍歷構造函數init前面須要加載convenience 3.在遍歷構造函數中須要明確的調用self.init() convenience init(_ imageName:String,bgImageName:String) { //1:必須首先調用self.init() self.init() //2:設置按鈕 let higlingStr = "_highlighted" //2:設置按鈕的bg圖片與普通圖片 setImage(UIImage(named:imageName), for: .normal) setImage(UIImage(named:imageName + higlingStr), for: .highlighted) setBackgroundImage(UIImage(named:bgImageName), for: .normal) setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted) //3:設置按鈕的尺寸 sizeToFit() } 注意:1:在構造函數中不用寫返回值,由於系統默認會返回 2:在類中調用該類的方法能夠省去self去調用 3:系統的第一個參數默認爲內部參數,從第二個參數開始即爲內部參數又爲外部參數,要想讓參數都變爲內部參數,則在參數的前面加_+空格,仿照蘋果系統的寫法 2:懶加載:1:懶加載時用關鍵字lazy,用private或是fileprivate來修飾 2:懶加載有兩種寫法:1:直接初始化 如方法1 2:利用閉包懶加載: fileprivate lazy var composeBtn = {return 業務邏輯+返回值}(); ,蘋果建議通常定義變量都使用懶加載 3:在定義變量或是屬性的時候,必須給定明確的初始化值或是可選類型,後面去賦值,不然會報錯 1:懶加載發佈按鈕,提供兩種建立對象的方法:1:類方法,用類點語法調用 fileprivate lazy var composeBtn : UIButton = UIButton.createButton(imageName: "tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button") 2:對象方法得到button的實例: fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") 3:代碼的書寫:1:在定義的類中定義屬性時,能夠懶加載屬性,也能夠定義成可選類型或是直接給屬性賦值,可是定義屬性的時候須要考慮用不用private或是fileprivate修飾 2:在viewDidLoad中抽方法封裝調用,封裝的方法寫在該類的extension擴展中 3:如果extension擴展中涉及某些業務邏輯的處理則寫成系統類的分類(類方法或是構造函數方法),工具類,繼承 2:在分類或是類中定義方法的時候,也要考慮用private或是fileprivate修飾,對按鈕事件的監聽:composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside) selector用#selector來包裝,按鈕點擊事件的方法用類去調用該方法,枚舉用.+枚舉值,其中按鈕的點擊方法也寫在extension的擴展中 3:封裝按鈕的點擊事件: extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } 事件監聽本質發送消息.可是發送消息是OC的特性 將方法包裝成@SEL --> 類中查找方法列表 --> 根據@SEL找到imp指針(函數指針) --> 執行函數 若是swift中將一個函數聲明稱private,fileprivate那麼該函數不會被添加到方法列表中 若是在private前面加上@objc,那麼該方法依然會被添加到方法列表中 */ class MainViewController: UITabBarController { // MARK:- 懶加載屬性 fileprivate lazy var composeBtn = UIButton("tabbar_compose_icon_add", bgImageName: "tabbar_compose_button") // MARK:- 系統回調函數 override func viewDidLoad() { super.viewDidLoad() //1:建立中間發佈按鈕 setupComposeBtn() } } // MARK:- 設置UI界面 extension MainViewController { /// 設置發佈按鈕 fileprivate func setupComposeBtn() { // 1.將composeBtn添加到tabbar中 tabBar.addSubview(composeBtn) // 2.設置位置 composeBtn.center = CGPoint(x: tabBar.center.x, y: tabBar.bounds.size.height * 0.5) //3:設置監聽 composeBtn.addTarget(self, action: #selector(MainViewController.composeBtnClic), for: .touchUpInside) } } //MARK:-發佈按鈕的監聽點擊 extension MainViewController { @objc fileprivate func composeBtnClic() { DLog(message: "hello--word") } }
發佈按鈕的擴展:swift
import UIKit extension UIButton { //MARK:-1:提供類方法 class func createButton(imageName:String,backgroundImageName:String) -> UIButton { //1:建立button let button = UIButton() let higlingStr = "_highlighted" //2:設置按鈕的bg圖片與普通圖片 button.setImage(UIImage(named:imageName), for: .normal) button.setImage(UIImage(named:imageName + higlingStr), for: .highlighted) button.setBackgroundImage(UIImage(named:backgroundImageName), for: .normal) button.setBackgroundImage(UIImage(named:backgroundImageName+higlingStr), for: .highlighted) //3:設置按鈕的尺寸 button.sizeToFit() //4:返回按鈕 return button } //MARK:-2:提供對象方法:在構造函數的對象方法中,self就是當前調用方法的對象,因此不用再去建立對象 convenience init(_ imageName:String, bgImageName:String) { //1:必須首先調用self.init() self.init() //2:設置按鈕 let higlingStr = "_highlighted" //2:設置按鈕的bg圖片與普通圖片 setImage(UIImage(named:imageName), for: .normal) setImage(UIImage(named:imageName + higlingStr), for: .highlighted) setBackgroundImage(UIImage(named:bgImageName), for: .normal) setBackgroundImage(UIImage(named:bgImageName+higlingStr), for: .highlighted) //3:設置按鈕的尺寸 sizeToFit() } }