自定義通用萬能UITableView

WBTableView 展示

WBTableVIew.gif

使用理由

系統(tǒng)的UITableView非常強大麻捻,大家也非常熟悉。但是<嫒铩3鹾瘛!它太繁瑣了遍略,每次使用都需要遵守<UITableViewDelegate,UITableViewDataSource>惧所,之后寫二個基本代理:numberOfRowsInSection,cellForRowAtIndexPath绪杏,代碼不僅多而且重復下愈,純粹浪費時間。
所以經(jīng)過之前對block的理解封裝了一個基礎(chǔ)的UITableView蕾久,不敢說功能多強大势似,最少你不必花費寫很多重復代碼,節(jié)約時間僧著。

思路

能不能寫一個公共的類來存放包括初始化UITableView履因,代理方法實現(xiàn)等重復的代碼,然后把方法里需要單獨處理的內(nèi)容使用block傳遞到外界盹愚,之后只需操作block里的不同方法實現(xiàn)達到目的栅迄。

文件解析:

WBTableView.h

WBTableView.h

  1. 定義了一個枚舉用于判斷是使用系統(tǒng)默認的UITableViewCell還是使用不帶xib自定義的tableViewCell注冊的;
  2. 之后定義了兩個block用于接收不同類調(diào)用tableView在代理方法處理方式不同的內(nèi)容操作皆怕;
  3. 暴露系統(tǒng)UITableView便于其他項目進行優(yōu)化或其他方法調(diào)用;
  4. initWithFrame:方法用于初始化自定義的tableView毅舆,registerTableViewCellByClassName:用于注冊綁定cell,其實這兩個方法可以放到一起愈腾,但是那樣一個參數(shù)就太多了憋活,也不能太懶了是不;
  5. selectTableViewCell:方法其實就相當于tableView的didSelectRowAtIndexPath方法虱黄,只是以后寫選中方法直接在block里編寫就OK了悦即。


WBTableView.m

WBTableView.m

  1. 定義identifier標識符,定義dataSourceArray數(shù)據(jù)源,定義cell方法回調(diào)函數(shù)WBDataSourceBlock,定義cell選中回調(diào)函數(shù)WBTableViewCellSelectBlock,定義系統(tǒng)UITableViewCell,定義delegate用于確定tableView要放在哪個視圖或控制器里;
  2. 初始化自定義tableView的時候需要初始化數(shù)據(jù)源、cell創(chuàng)建的block、delegate所屬父視圖辜梳;
    3.單獨使用一個方法初始化系統(tǒng)UITableView粱甫,同時通過初始化自定義tableView傳過來的delegate父視圖判斷類型之后放置到父視圖上;
  3. registerTableViewCellByClassName:方法類似系統(tǒng)UITabelView的register方法冗美,不過是把系統(tǒng)的兩種register和默認注冊cell的方法合并成這個方法魔种,之后根據(jù)WBRegisterMode類型進行注冊類型判斷;
    5.在cellForRowAtIndexPath代理方法里使用_dataSourceBlock調(diào)用下粉洼。
    6.同理在didSelectRowAtIndexPath代理方法里使用_tableViewCellSelectBlock調(diào)用节预,之后外界調(diào)用selectTableViewCell方法使用block回調(diào)。

注意:

這只是個最初的版本属韧,沒有加入可變高度的支持安拟,也沒有head的自定義等,可能還會存在內(nèi)存泄漏等亂七八糟的問題宵喂。所以最好在使用的時候能自己看下糠赦,試著理解下,畢竟這些是最基礎(chǔ)的知識構(gòu)成锅棕,完全沒用任何復雜技術(shù)拙泽。

使用說明

  1. 把WBTableView文件夾拖到項目中;
  2. 導入頭文件#import "WBTableView.h";
  3. 使用- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style dataSourceArray:(NSArray *)dataSourceArray delegate:(id)delegate dataSourceBlock:(WBDataSourceBlock)dataSourceBlock 方法初始化WBTableView;
  4. 使用- (void)registerTableViewCellByClassName:(NSString *)className registerMode:(WBRegisterMode)registerMode identifier:(NSString *)identifier注冊自定義UITableViewCell;
  5. (可選)選中某行cell需要調(diào)用- (void)selectTableViewCell:(WBTableViewCellSelectBlock)tableViewCellSelectBlock方法;

更新

  1. 新增tableView的組數(shù)個數(shù)自定義裸燎;
  2. 新增cell行高自定義顾瞻;

例:

/**
 初始化tableView
 */
- (void)setupTableView {
    
    //創(chuàng)建數(shù)據(jù)源數(shù)據(jù)
    NSMutableArray *muArray = [[NSMutableArray alloc] init];
    for(int i = 0 ; i < 10; i++) {
        [muArray addObject:[NSString stringWithFormat:@"這是第%d行",i+1]];
    }
    self.dataSourceArray = [muArray copy];
    
    //初始化自定義tableView
    _wbTableView = [[WBTableView alloc] initWithFrame:CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 50) style:UITableViewStylePlain dataSourceArray:_dataSourceArray delegate:self dataSourceBlock:^(id wbCell, id wbData) {
        WB1TableViewCell *cell = (WB1TableViewCell *)wbCell;
        cell.data = wbData;
    }];
    
    //注冊自定義tableViewCell
    [_wbTableView registerTableViewCellByClassName:@"WB1TableViewCell" registerMode:WBRegisterModeClass identifier:@"identifier"];
    
    //tableViewCell選中
    [_wbTableView selectTableViewCell:^(id wbCell, id wbData) {
        NSLog(@"data = %@",wbData);
    }];

    //新增:
    //設(shè)置section個數(shù)
    _wbTableView.sectionNumber = 3;
    
    //設(shè)置cell行高
    _wbTableView.cellHeight = 88;
}

如果有任何問題或者好建議歡迎修正和討論,謝謝德绿!~
最后附上WBTableView Demo地址:GitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荷荤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子移稳,更是在濱河造成了極大的恐慌蕴纳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件个粱,死亡現(xiàn)場離奇詭異古毛,居然都是意外死亡,警方通過查閱死者的電腦和手機都许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門稻薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梭稚,你說我怎么就攤上這事颖低⌒醭常” “怎么了弧烤?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我暇昂,道長莺戒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任急波,我火速辦了婚禮从铲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澄暮。我一直安慰自己名段,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布泣懊。 她就那樣靜靜地躺著伸辟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馍刮。 梳的紋絲不亂的頭發(fā)上信夫,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音卡啰,去河邊找鬼静稻。 笑死,一個胖子當著我的面吹牛匈辱,可吹牛的內(nèi)容都是我干的振湾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼梅誓,長吁一口氣:“原來是場噩夢啊……” “哼恰梢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梗掰,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嵌言,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后及穗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摧茴,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年埂陆,在試婚紗的時候發(fā)現(xiàn)自己被綠了苛白。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡焚虱,死狀恐怖购裙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹃栽,我是刑警寧澤躏率,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響薇芝,放射性物質(zhì)發(fā)生泄漏蓬抄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一夯到、第九天 我趴在偏房一處隱蔽的房頂上張望嚷缭。 院中可真熱鬧,春花似錦耍贾、人聲如沸阅爽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽优床。三九已至,卻和暖如春誓焦,著一層夾襖步出監(jiān)牢的瞬間胆敞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工杂伟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留移层,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓赫粥,卻偏偏與公主長得像观话,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子越平,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件频蛔,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 8,987評論 3 38
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫秦叛、插件晦溪、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 講文明懂禮貌之學校禮儀 整齊的隊伍,訓練有素挣跋。團體力量三圆。 一首《上學歌》,與所有人清早打招呼開始避咆,傳遞熱情舟肉。 文明...
    破繭成蝶我最棒閱讀 312評論 0 0
  • 應用程序編程接口(API)參考文檔 UIWebView Offical API reference WKWeb...
    獨木舟的木閱讀 708評論 0 0