UITableView 二級列表相關(guān)應(yīng)用和問題處理

近期項(xiàng)目改版眠屎,新加了二級列表展開的需求剔交,效果如下:

圖例.png

邏輯分析:

二級列表,主要功能是子列表的折疊和展開改衩,且默認(rèn)是折疊狀態(tài)岖常。這就需要用到tableView的section 和 row,即section 是父列表單元,每個(gè)section下的row為子列表單元葫督,且每次點(diǎn)擊section需要存儲(chǔ)點(diǎn)擊狀態(tài)竭鞍,從而表現(xiàn)子列表的折疊和展開效果。由于接口數(shù)據(jù)也是二級表單橄镜,因此model在創(chuàng)建時(shí)也是二級結(jié)構(gòu)偎快,這點(diǎn)需要注意。

代碼:

#import "studentMemberListView.h"

@interface studentMemberListView ()<UITableViewDelegate,UITableViewDataSource>
{
    BOOL status[10];//結(jié)構(gòu)體用于存儲(chǔ)section點(diǎn)擊的bool值
}

@property(nonatomic, strong)UITableView *memberList;


@end

@implementation studentMemberListView

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        [self addSubUI];
        //默認(rèn)第一個(gè)分組是打開的
       status[0] = YES;
    }
    return self;
}

-(void)addSubUI
{
    [self addSubview:self.memberList];
    self.memberList.frame = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
}

#pragma mark -----tableDelgate&dataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
  (NSInteger)section{

       BOOL closeAge = status[section];
       //關(guān)閉顯示為0行
       if (closeAge == NO) {
           return 0;
       }
       
       return 3;
       
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
  (NSIndexPath *)indexPath{

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell1"];
       if (cell == nil) {
           
           cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell1"];
           cell.backgroundColor = [UIColor whiteColor];
           cell.textLabel.textColor = [UIColor grayColor];
       }
        cell.textLabel.text = @"subcell11111111";
        return cell;

    
}
- (void)sectionAction:(UIControl *)control{
    
    NSInteger section = control.tag;
    
    status[section] = !status[section];
    
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:section];
   
    [_memberList reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone]; //刷新制定單元格
    return cell;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    return 3;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //設(shè)置cell 高度
    return  76;
}
//section的header view的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    
    return 44;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
 (NSIndexPath *)indexPath{
   [tableView deselectRowAtIndexPath:indexPath animated:YES];
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   NSLog(@"Section:%d Row:%d selected and its data is %@",
   indexPath.section,indexPath.row,cell.textLabel.text);
    
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
  //推出到子VC
    //[self.navigationController pushViewController:[[studentDeatilViewController alloc] init] animated:YES];
}

//自定義section的header view
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    
    UIControl *titileView = [[UIControl alloc] initWithFrame:CGRectZero];
    titileView.tag = section;
    [titileView addTarget:self action:@selector(sectionAction:) forControlEvents:UIControlEventTouchUpInside];

    //設(shè)置  頭視圖的標(biāo)題
    UILabel *titleLable = [[UILabel alloc] initWithFrame:CGRectMake(40, 12, 100, 30)];
    titleLable.backgroundColor = [UIColor clearColor];
    titleLable.textColor = [UIColor blackColor];
    titleLable.font = [UIFont systemFontOfSize:18];
    titleLable.text = @"title111111111111";
    [titleLable sizeToFit];
    [titileView addSubview:titleLable];
    
    return titileView;
}

-(UITableView *)memberList
{
    if (!_memberList) {
        _memberList = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
        _memberList.delegate = self;
        _memberList.dataSource = self;
        _memberList.backgroundColor = [UIColor whiteColor];
        _memberList.separatorStyle = UITableViewCellSeparatorStyleNone;
        [_memberList registerClass:[UITableViewCell class]  forCellReuseIdentifier: @"cell"1];
 
    }
    return _memberList;
}

這里需要說的是洽胶,一開始筆者是打算用model來存儲(chǔ)section的點(diǎn)擊bool值的晒夹,但是在參考囧囧的文章后,發(fā)現(xiàn)其引入的結(jié)構(gòu)體status更簡潔妖异,于是惋戏,這里借用了一下。
需要注意的是:status[10]為C語言中的結(jié)構(gòu)體他膳,這里你可以理解為oc語言中:一個(gè)數(shù)組+字典的概念响逢,具體這里不展開敘述,有要求可百度了解棕孙,而10則為結(jié)構(gòu)體的空間舔亭,如果你需要開辟多個(gè),那將10增大即可蟀俊。

另外添加一個(gè)在開發(fā)二級列表中遇到的問題:列表在大于一頁時(shí)钦铺,展開子類表再折疊后,列表會(huì)上下抖動(dòng)肢预。在我查閱相關(guān)資料后得知矛洞,抖動(dòng)是因?yàn)榱斜頉]有設(shè)置初始高度,再后期展開再折疊刷新section后烫映,系統(tǒng)IOS11后列表為了優(yōu)化布局沼本,會(huì)重新計(jì)算高度,因此會(huì)出現(xiàn)抖動(dòng)锭沟。解決方法如下:

1.在刷新時(shí)添加performWithoutAnimationBlock:

//刷新制定單元格
            [UIView performWithoutAnimation:^{
                    [self.memberList reloadSections:indexSet withRowAnimation:UITableViewRowAnimationNone];
                }];

2.在tableView初始化時(shí)設(shè)定列表初始高度:

-(UITableView *)memberList
{
    if (!_memberList) {
        _memberList = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
        _memberList.delegate = self;
        _memberList.dataSource = self;
        _memberList.backgroundColor = [UIColor whiteColor];
        _memberList.separatorStyle = UITableViewCellSeparatorStyleNone;
         [_memberList registerClass:[UITableViewCell class]  forCellReuseIdentifier: @"cell"1];
        if (@available(iOS 11.0, *)) {
            //設(shè)定默認(rèn)cell高度抽兆,防止展開頁面抖動(dòng)
                UITableView.appearance.estimatedRowHeight = 0;
                UITableView.appearance.estimatedSectionFooterHeight = 0;
                UITableView.appearance.estimatedSectionHeaderHeight = 0;
        }
    }
    return _memberList;
}

至此,二級列表相關(guān)問題解決如此族淮,你學(xué)廢了嗎辫红?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凭涂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贴妻,更是在濱河造成了極大的恐慌切油,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件名惩,死亡現(xiàn)場離奇詭異白翻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绢片,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岛琼,“玉大人底循,你說我怎么就攤上這事』比穑” “怎么了熙涤?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長困檩。 經(jīng)常有香客問我祠挫,道長,這世上最難降的妖魔是什么悼沿? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任等舔,我火速辦了婚禮,結(jié)果婚禮上蚤假,老公的妹妹穿的比我還像新娘祟绊。我一直安慰自己假瞬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布蝶柿。 她就那樣靜靜地躺著,像睡著了一般非驮。 火紅的嫁衣襯著肌膚如雪交汤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天劫笙,我揣著相機(jī)與錄音芙扎,去河邊找鬼。 笑死邀摆,一個(gè)胖子當(dāng)著我的面吹牛纵顾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栋盹,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼施逾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汉额,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤曹仗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蠕搜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎茫,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年妓灌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轨蛤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虫埂,死狀恐怖祥山,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掉伏,我是刑警寧澤缝呕,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站斧散,受9級特大地震影響供常,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸡捐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一栈暇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闯参,春花似錦瞻鹏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脚草,卻和暖如春赫悄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馏慨。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工埂淮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人写隶。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓倔撞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慕趴。 傳聞我的和親對象是個(gè)殘疾皇子痪蝇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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