UITableView模塊式列表處理

有這么種需求:也個頁面由固定的幾種模塊組成鸥拧,假設如下圖ABCDE 5個模塊收壕,有些時候僅有AB模塊,有些時候是ABC模塊琅摩,app版本2需要在上一版本中去掉或者增加些個模塊或者調整模塊之間的順序此迅。


示例圖

這種情況下如果沒有一種方式來控制汽畴,那么就坑大了,table的代理好幾個耸序,需要你各個代理內各種條件判斷整袁,每次需求變動后個種改...我接手過這種代碼,我是很寧亂佑吝。

這里介紹的方式是針對section來處理的,且不設計到手勢刪除什么的绳匀,沒測試過芋忿,當待補充吧。

怎么搞疾棵,對table封裝一下戈钢?NO,是搞個轉接對象是尔,這個對象的功能是負責粘合table代理的那些個方法之間的邏輯同步殉了,簡單來說就是指向同一個對象控制,然后代理通過這個轉接對象來獲取原本需要的數據拟枚。
原理介紹完了薪铜,介紹一下使用:
table的各種代理:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.group.numberOfSections;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.group numberOfRowsInSection:section];
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return [self.group heightForHeaderInSection:section];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    return [self.group cellForRowAtIndexPath:indexPath];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.group didSelectRowAtIndexPath:indexPath];
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    return [self.group viewForHeaderInSection:section];
}

group創(chuàng)建示例:

-(void)reloadData {
    self.group = [[AYListGroup alloc] init];
    [self.group addObject:[self section_QDHD]];
    [self.group addObject:[self section_QDJB]];
    [self.group addObject:[self section_GYQD]];
    [self.group addObject:[self section_RYQ]];
    [self.group addObject:[self section_QDCY]];
    [self.group addObject:[self section_LCB]];
    [self.group addObject:[self section_QDXC]];
    [self.tableView reloadData];
}

section創(chuàng)建示例:

-(AYSection*)section_QDHD {
    AYSection *section = [[AYSection alloc] init];
    section.titleForHeider = @"ttle";
    section.heightForHeader = CommonSectionHeaderViewHeight;
    section.hidden = !self.isInTeam || ([self.roughlyStateOfUteam.uactivityEnrollsCount integerValue]==0 && self.roughlyStateOfUteam.uactivityEnrolls.count==0);
    __weak typeof(self) wself = self;
    [section numberOfRows:nil cellForRow:^UITableViewCell *(NSUInteger index, CGFloat height, AYSection *section) {
        if (wself.roughlyStateOfUteam.uactivityEnrolls.count==0) {
            return [wself emptyCellWithContent:section.flag leightContent:nil];
        }else{
            MineActivityCell *cell = [wself.tableView dequeueReusableCellWithIdentifier:MineActivityCellID];
            [cell config:wself.roughlyStateOfUteam.uactivityEnrolls[0] indexPath:nil];
            return cell;
        }
    } height:nil didSelect:^(NSUInteger index, AYSection *section) {
        if (wself.roughlyStateOfUteam.uactivityEnrolls.count>0){
            MyActivityModel *model = wself.roughlyStateOfUteam.uactivityEnrolls[0];
            //已結束單獨用一種鏈接
            NSInteger status = 2;
            if ([model.activityStatus isEqualToString:@"4"]) {
                status = 3;
            } else {
                status = 2;
            }
            FlowWebViewController *fWebVC = [FlowWebViewController ApplyYueZhanWithParams:nil duelId:nil applyId:model.keyId status:status];
            [wself presentFlowViewController:fWebVC animated:YES];
        }
    } didDeselect:nil];
    
    [section viewForHeader:^UIView *(AYSection *section) {
        CommonSectionHeaderView *viewHeader = [wself.tableView dequeueReusableHeaderFooterViewWithIdentifier:CommonSectionHeaderView_reuseIdentifier];
        UIImage *subImage = (wself.roughlyStateOfUteam.uactivityEnrolls.count>1 || (wself.roughlyStateOfUteam.uactivityEnrolls.count <=1 && [wself.roughlyStateOfUteam.uactivityEnrollsCount integerValue]>0))?[UIImage imageNamed:@"gengduo"]:nil;
        [viewHeader styleWithTitle:section.titleForHeider subTitle:nil subImage:subImage action:^{
            
            if (wself.roughlyStateOfUteam.uactivityEnrolls.count>1 || (wself.roughlyStateOfUteam.uactivityEnrolls.count <=1 && [wself.roughlyStateOfUteam.uactivityEnrollsCount integerValue]>0)) {
                MineActivitySubVC * activitySubVC = [MineActivitySubVC MineActivity_TeamInitiateWithId:wself.teamId];
                activitySubVC.title = @"title2";
                [wself.navigationController pushViewController:activitySubVC animated:YES];
            }
        }];
        return viewHeader;
    }];
    return section;
}

section示例 是項目實際代碼众弓,有點多,試想一下有5個不固定這種邏輯的模塊來各種組合隔箍,5個不多吧谓娃,我這是7個,坑不是有點大蜒滩,是很大很大滨达。
下邊貼一下section創(chuàng)建的簡單函數:

-(AYSection*)section {
    AYSection *section = [[AYSection alloc] init];
    section.titleForHeider = @"標題";
    section.flag = @"其它跟隨標記或副標題";
    section.heightForHeader = 30;
    section.hidden = YES;//顯示隱藏
    __weak typeof(self) wself = self;
    [section numberOfRows:^NSUInteger(AYSection * _Nonnull section) {
        return 10;
    } cellForRow:^UITableViewCell * _Nonnull(NSUInteger index, CGFloat height, AYSection * _Nonnull section) {
        UITableViewCell *cell = [wself.tableView dequeueReusableCellWithIdentifier:@"Identifier"];
        return cell;
    } height:^CGFloat(NSUInteger index, AYSection * _Nonnull section) {//nil時候采用defaultCellHeight
        return 20;
    } didSelect:^(NSUInteger index, AYSection * _Nonnull section) {
        //...
    } didDeselect:^(NSUInteger index, AYSection * _Nonnull section) {
        //...
    }];
    return section;
}

是不是清爽了許多。

這樣一來俯艰,模塊式table的各個模塊內處理邏輯就互不干擾了捡遍,隨便增刪改順序。

到這里想必你已經明白了我的思路了竹握。

ps:代碼其實沒什么画株,介紹的是思路。要是有什么類庫可以介紹一下涩搓。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末污秆,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子昧甘,更是在濱河造成了極大的恐慌良拼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充边,死亡現場離奇詭異庸推,居然都是意外死亡,警方通過查閱死者的電腦和手機浇冰,發(fā)現死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門贬媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肘习,你說我怎么就攤上這事际乘。” “怎么了漂佩?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵脖含,是天一觀的道長。 經常有香客問我投蝉,道長养葵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任瘩缆,我火速辦了婚禮关拒,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己着绊,他們只是感情好谐算,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畔柔,像睡著了一般氯夷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靶擦,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天腮考,我揣著相機與錄音,去河邊找鬼玄捕。 笑死踩蔚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的枚粘。 我是一名探鬼主播馅闽,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馍迄!你這毒婦竟也來了福也?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤攀圈,失蹤者是張志新(化名)和其女友劉穎暴凑,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體赘来,經...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡现喳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了犬辰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦篱。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幌缝,靈堂內的尸體忽然破棺而出灸促,到底是詐尸還是另有隱情,我是刑警寧澤涵卵,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布浴栽,位于F島的核電站,受9級特大地震影響缘厢,放射性物質發(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

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 發(fā)現 關注 消息 iOS 第三方庫拓巧、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,870評論 2 11
  • 方便自己查找 SEL 它是selector在 Objc 中的表示(Swift 中是 Selector 類)一死。sel...
    遮住眼睛的草紙閱讀 165評論 0 1
  • 早晨雷聲轟隆隆肛度,雷雨交加,好嚇人罢贤斜!瑤仔六點就早早的起床了,說被雷聲嚇到了……轟的一聲打雷逛裤,停電了……雨一直下著瘩绒,...