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创建示例:

-(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创建示例:

-(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创建的简单函数:

-(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阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容