swift項目第六天:中間發佈按鈕的封裝以及監聽點擊事件

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()
        
    }
    
}
相關文章
相關標籤/搜索