Swift父類tableView,網(wǎng)絡(luò)請求等操作的封裝

之前在網(wǎng)上看到一個OC封裝的父類,即把網(wǎng)絡(luò)請求,網(wǎng)絡(luò)出錯處理,沒有數(shù)據(jù)處理,tableView的上下拉刷新,tableView的dataSource和delegate,cell的初始化,高度的計算,分頁等都封裝到父類.方便開發(fā)使用,無需每次都敲一遍.

這邊我自己用Swift3.1又實現(xiàn)了一遍(其中有封裝的比較簡單的父類,也有封裝比較全的父類)并且將其進行了改進(個人認(rèn)為是改進),方便開發(fā)使用,去除了重復(fù)的代碼與工作.

開始使用吧(這邊以使用封裝好的表格父類為例,例子中數(shù)據(jù)來源是快遞的查詢API,需要傳遞快遞的編號,寫得時候我的那個快遞還沒到,以后可能數(shù)據(jù)信息會失效,故自己把快的編號換成一個你自己的淘寶剛下單的寶貝快的編號(postid),對應(yīng)的快遞公司的編號(type)也要修改)免費的快遞查詢API地址點擊這里

第一步創(chuàng)建start

創(chuàng)建一個實現(xiàn)遵循父協(xié)議PJBaseTableViewDataSourceAndDelegate的類PJTableViewDemoDataSource,父協(xié)議PJBaseTableViewDataSourceAndDelegate遵循NSObject,UITableViewDataSource,UITableViewDelegate,PJBaseTableViewDataSourceDelegate協(xié)議,其中PJBaseTableViewDataSourceDelegate協(xié)議的定義如下:

protocol  PJBaseTableViewDataSourceDelegate{
    
    /**
     * 子類必須實現(xiàn)協(xié)議,以告訴表格每個model所對應(yīng)的cell是哪個
     */
    func tableView(tableView: UITableView, cellClassForObject object: AnyObject?) -> AnyClass
    
    /**
     *若為多組需要子類重寫
     */
    func tableView(tableView: UITableView, indexPathForObject object: AnyObject) -> NSIndexPath?
    
    func tableView(tableView: UITableView, objectForRowAtIndexPath indexPath: IndexPath) -> AnyObject?
    
    /// MARK: 子類可以重寫以獲取到剛初始化的cell,可在此時做一些額外的操作
    func pj_tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath, cell: UITableViewCell,object:AnyObject?)
}

PJTableViewDemoDataSource類必須實現(xiàn):

// MARK: /***********必須重寫以告訴表格什么數(shù)據(jù)模型對應(yīng)什么cell*************/
    override func tableView(tableView: UITableView, cellClassForObject object: AnyObject?) -> AnyClass {
        if let _ = object?.isKind(of: 數(shù)據(jù)模型類型){
            return 返回對應(yīng)cell類型
        }
        return super.tableView(tableView: tableView, cellClassForObject: object)
    }

創(chuàng)建一個控制器繼承表格父類

class PJTableViewDemoController: PJBaseTableViewController(**表格父類**)

定一個PJTableViewDemoDataSource屬性:

lazy var pjTableViewDemoDataSource : PJTableViewDemoDataSource = {
        let tempDataSource = PJTableViewDemoDataSource(dataSourceWithItems: nil)
        // TODO: /*******cell點擊事件*******/
        tempDataSource.cellClickClosure = {
            (tableView:UITableView,indexPath : IndexPath,cell : UITableViewCell,object : Any?) in
            PJSVProgressHUD.showSuccess(withStatus: "點擊了cell")
        }
        
        // TODO: /************cell的子控件的點擊事件************/
        tempDataSource.subVieClickClosure = {
            (sender:AnyObject?, object:AnyObject?) in
            
        }
        return tempDataSource
    }()

到這邊創(chuàng)建工作end

第二步使用start

在PJTableViewDemoController類中實現(xiàn)以下方法:

/**
 *   子類重寫
 */
extension PJTableViewDemoController{
    
    /**
     *   網(wǎng)絡(luò)請求完成
     */
    override func requestDidFinishLoad(success: AnyObject?, failure: AnyObject?) {
        if let response = success{
            let expressModel : ExpressModel = ExpressModel.mj_object(withKeyValues: response)
            self.updateView(expressModel: expressModel)
        }
    }
 
    func updateView(expressModel : ExpressModel){
        // TODO: - 注意此處添加網(wǎng)絡(luò)返回的數(shù)據(jù)到表格代理數(shù)據(jù)源中
        self.pjTableViewDemoDataSource.addItems(items: expressModel.data)
        // TODO: - 更新表格顯示self.createDataSource(),該調(diào)用會在父類進行,子類無需再次手動調(diào)用
    }
    
    /**
     *   網(wǎng)絡(luò)請求失敗
     */
    override func requestDidFailLoadWithError(failure: AnyObject?) {
        
    }
    
    /**
     *   以設(shè)置tableView數(shù)據(jù)源
     */
    override func createDataSource(){
        self.dataSourceAndDelegate = self.pjTableViewDemoDataSource
    }
    
    // MARK: 網(wǎng)絡(luò)請求地址
    override func getRequestUrl() -> String{
        return "http://www.kuaidi100.com/query"
    }
    
    // MARK: 網(wǎng)絡(luò)請求參數(shù)
    override func getParams() -> [String:Any]{
        return ["type":"shentong","postid":"3330209976637"]
    }
}

方法是以重寫的方式,故需要重寫的可以重寫,無需的即不必重寫

到這里只需要self.doRequest()(在viewDidLoad中調(diào)用即可)就完成一個從網(wǎng)絡(luò)加載數(shù)據(jù)并且顯示在tableView的操作,并且已經(jīng)封裝好上下拉刷新,分頁等.end

!!!!!!備注:關(guān)于cell高度的計算分為自動計算與手動計算,默認(rèn)自動計算,自動計算時-->注意label如果是有換行的需要設(shè)置preferredMaxLayoutWidth屬性,否則在iOS10等系統(tǒng)上label無法自動換行<--,這邊的自動計算高度用的是FDTemplateLayoutCel(自動布局模式,當(dāng)然可以自行添加frame計算模式),相關(guān)代碼:

/**
     計算cell高度的方式,自動計算(利用FDTemplateLayoutCell庫)和手動frame計算,默認(rèn)自動計算,如果是手動計算則cell子類需要重寫class func tableView(tableView: UITableView, rowHeightForObject model: AnyObject?,indexPath:IndexPath) -> CGFloat
     **注意label如果是有換行的需要設(shè)置preferredMaxLayoutWidth屬性,否則在iOS10等系統(tǒng)上label無法自動換行**
     */
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        //自動計算cell高度(帶有緩存)
        if self.isAutoCalculate{
            return tableView.fd_heightForCell(withIdentifier: cellID, cacheBy: indexPath) { [weak self] (cell : Any?) in
                guard let tempCell = cell as? PJBaseTableViewCell else{
                    return
                }
                //自動計算cell高度
                tempCell.setModel(model: self?.tableView(tableView: tableView, objectForRowAtIndexPath: indexPath))
            }
        }else{
            return self.getHeightForRow(tableView: tableView, atIndexPath: indexPath)
        }
    }
    
    /**
     獲取cell的高度
     */
    func getHeightForRow(tableView:UITableView, atIndexPath indexPath:IndexPath) -> CGFloat{
        let object = self.tableView(tableView: tableView, objectForRowAtIndexPath: indexPath)
        let cls : AnyClass = self.tableView(tableView: tableView, cellClassForObject: object)
        if let tempCls = cls as? PJBaseTableViewCell.Type{
            return tempCls.tableView(tableView: tableView, rowHeightForObject: object,indexPath:indexPath)
        }else{
            return 44.0;
        }
 }

gitHub地址點這里

福建代碼注釋寫得最爛的男人??(有問題聯(lián)系804488815@qq.com)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渠鸽,隨后出現(xiàn)的幾起案子钱反,更是在濱河造成了極大的恐慌,老刑警劉巖页藻,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旧乞,死亡現(xiàn)場離奇詭異吊洼,居然都是意外死亡,警方通過查閱死者的電腦和手機灌危,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門康二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勇蝙,你說我怎么就攤上這事沫勿。” “怎么了味混?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵产雹,是天一觀的道長。 經(jīng)常有香客問我翁锡,道長蔓挖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任馆衔,我火速辦了婚禮瘟判,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘角溃。我一直安慰自己拷获,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布减细。 她就那樣靜靜地躺著匆瓜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪未蝌。 梳的紋絲不亂的頭發(fā)上驮吱,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音树埠,去河邊找鬼糠馆。 笑死嘶伟,一個胖子當(dāng)著我的面吹牛怎憋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼绊袋,長吁一口氣:“原來是場噩夢啊……” “哼毕匀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起癌别,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤皂岔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后展姐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躁垛,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年圾笨,在試婚紗的時候發(fā)現(xiàn)自己被綠了教馆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡擂达,死狀恐怖土铺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情板鬓,我是刑警寧澤悲敷,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站俭令,受9級特大地震影響后德,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抄腔,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一探遵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妓柜,春花似錦箱季、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至作煌,卻和暖如春掘殴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粟誓。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工奏寨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹰服。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓病瞳,卻偏偏與公主長得像揽咕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子套菜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP亲善、TCP、Http逗柴、Socket蛹头、X...
    Carden閱讀 4,326評論 0 12
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,761評論 25 707
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,131評論 30 470
  • 開篇批判性思維就說到十大思維謬誤 1生成謬誤:通過批評其來源而反駁其立場或論證脫口秀主持人樂于此道 2稻草人謬誤:...
    刺猬門房閱讀 260評論 0 0
  • 新的學(xué)期,新的開始新的面孔戏溺,心都準(zhǔn)備渣蜗,一切都是新的。新的老師嗎旷祸?能不能嘍俗話說新的一年里袍睡,什么都是新的。那是感情沒...
    12一二閱讀 202評論 0 0