iOS 三級(jí)列表

先看效果

效果圖.gif

先上代碼吓揪,在講思路!所计!

創(chuàng)建tableView
-(UITableView *)table{
    if (!_table) {
        _table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
        _table.delegate = self;
        _table.dataSource = self;
        _table.tableFooterView = [UIView new];
        [myCell registerTableViewWith:_table];
    }
    return _table;
}
創(chuàng)建總的數(shù)據(jù)模型柠辞,后面只操作這一個(gè)模型數(shù)組
-(NSMutableArray *)dataArr{
    if (!_dataArr) {
        _dataArr = @[].mutableCopy;
    }
    return _dataArr;
}
模型結(jié)構(gòu)
@interface ListModel : NSObject

@property (nonatomic ,copy) NSString *name;
///是否展開收起
@property (nonatomic ,assign) BOOL isOpen;

///子節(jié)點(diǎn)
@property (nonatomic ,strong) NSMutableArray *array;

@property (nonatomic ,assign) int leave;

@end
模擬數(shù)據(jù),通過leave來(lái)區(qū)別是第幾級(jí)數(shù)據(jù):0是一級(jí)數(shù)據(jù),1是二級(jí)數(shù)據(jù)醉箕,2是三級(jí)數(shù)據(jù)
-(void)initData{
    for (int i = 0; i < 10; i++) {
        ListModel *model = [[ListModel alloc] init];
        model.name = [NSString stringWithFormat:@"%d", I];
        model.array = @[].mutableCopy;
        model.leave = 0;
        
        for (int j = 0; j < 3; j++) {
            ListModel *sonModel = [[ListModel alloc] init];
            sonModel.leave = 1;
            sonModel.array = @[].mutableCopy;
            sonModel.name = [NSString stringWithFormat:@"      j-%d",j];
            [model.array addObject:sonModel];
            
            for (int p = 0; p < 4; p++) {
                ListModel *nextModel = [[ListModel alloc] init];
                nextModel.leave = 2;
                nextModel.name = [NSString stringWithFormat:@"   p-%d",p];
                [sonModel.array addObject:nextModel];
            }
        }
        [self.dataArr addObject:model];
    }
    [self.table reloadData];
}
自定義cell
@interface myCell : UITableViewCell
+(NSString *)identifier;
+(void)registerTableViewWith:(UITableView *)table;
@property (nonatomic ,strong) UILabel *nameLab;
@property (nonatomic ,strong) UILabel *fLab;
@end

@implementation myCell


-(UILabel *)nameLab{
    if (!_nameLab) {
        _nameLab = [[UILabel alloc] initWithFrame:CGRectMake(100, 14, 100, 25)];
    }
    return _nameLab;
}

-(UILabel *)fLab{
    if (!_fLab) {
        _fLab = [[UILabel alloc] initWithFrame:CGRectMake(10, 14, 40, 25)];
        _fLab.text = @"展開";
    }
    return _fLab;
}

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        [self.contentView addSubview:self.nameLab];
        [self.contentView addSubview:self.fLab];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    return self;
}

+(NSString *)identifier{
    return NSStringFromClass([self class]);
}

+(void)registerTableViewWith:(UITableView *)table{
    [table registerClass:[self class] forCellReuseIdentifier:[self identifier]];
}

@end
核心代碼
#pragma mark tableView的代理
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    myCell *cell = [tableView dequeueReusableCellWithIdentifier:[myCell identifier]];
    
    ListModel *model = self.dataArr[indexPath.row];
    cell.nameLab.text = model.name;
    
    if (model.leave == 1) {
        cell.backgroundColor = UIColor.redColor;
        cell.fLab.frame = CGRectMake(25, 14, 40, 25);
    }
    else if (model.leave == 2){
        cell.backgroundColor = UIColor.brownColor;
        cell.fLab.frame = CGRectMake(35, 14, 40, 25);
    }
    else{
        cell.backgroundColor = UIColor.whiteColor;
        cell.fLab.frame = CGRectMake(10, 14, 40, 25);
    }
    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataArr.count;
}
tableViewCell 點(diǎn)擊方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    myCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    ListModel *model = self.dataArr[indexPath.row];
    model.isOpen = !model.isOpen;
    self.rowCount = indexPath.row;
    if (model.isOpen) {
        [self insertDataArr:model.array];
        cell.fLab.text = @"收起";
    }else{
        //刪除添加的model
        [self deleteRowWith:model.array deleteRow:indexPath.row];
        cell.fLab.text = @"展開";
    }
}
///插入cell
-(void)insertDataArr:(NSMutableArray *)array{
    NSMutableArray *arr = [NSMutableArray array];
    [self insertModelArr:array resultArray:arr];
    [self.table beginUpdates];
    [self.table insertRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.table endUpdates];
}

-(void)insertModelArr:(NSMutableArray *)array resultArray:(NSMutableArray *)resultArr{
    for (int i = 0; i < array.count; i++) {
        ListModel *model = array[I];
        self.rowCount++;
        [self.dataArr insertObject:model atIndex:self.rowCount];
        NSIndexPath *index = [NSIndexPath indexPathForRow:self.rowCount inSection:0];
        [resultArr addObject:index];
        if (model.isOpen) {
            [self insertModelArr:model.array resultArray:resultArr];
        }
    }
}

///刪除cell
-(void)deleteRowWith:(NSMutableArray *)array deleteRow:(NSInteger)row{
    NSMutableArray *arr = [NSMutableArray array];
    [self deleteRow:array deleteRow:row resultArray:arr];
    [self.table beginUpdates];
    [self.table deleteRowsAtIndexPaths:arr withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.table endUpdates];
}

-(void) deleteRow:(NSMutableArray *)array deleteRow:(NSInteger)row resultArray:(NSMutableArray *)resultArr{
    for (int i = 0; i < array.count; i++) {
        ListModel *model = array[I];
        [self.dataArr removeObject:model];
        ++row;
        NSIndexPath *index = [NSIndexPath indexPathForRow:row inSection:0];
        [resultArr addObject:index];
        if (model.isOpen == YES) {
            [self deleteRow:model.array deleteRow:row resultArray:resultArr];
            NSIndexPath *index = resultArr.lastObject;
            row = index.row;
        }
    }
}

思路:

點(diǎn)擊哪個(gè)cell 就把對(duì)用的模型 放到 self.dataArr 這個(gè)數(shù)組中,然后刷新列表達(dá)到展開效果徙垫,收起的話也是通過刪除對(duì)應(yīng)的模型再刷新列表讥裤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姻报,隨后出現(xiàn)的幾起案子己英,更是在濱河造成了極大的恐慌,老刑警劉巖吴旋,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损肛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荣瑟,警方通過查閱死者的電腦和手機(jī)治拿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笆焰,“玉大人劫谅,你說我怎么就攤上這事∪侣樱” “怎么了捏检?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)不皆。 經(jīng)常有香客問我贯城,道長(zhǎng),這世上最難降的妖魔是什么霹娄? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任能犯,我火速辦了婚禮鲫骗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悲雳。我一直安慰自己挎峦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布合瓢。 她就那樣靜靜地躺著坦胶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晴楔。 梳的紋絲不亂的頭發(fā)上顿苇,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音税弃,去河邊找鬼纪岁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛则果,可吹牛的內(nèi)容都是我干的幔翰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼西壮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遗增!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起款青,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤做修,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抡草,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饰及,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年康震,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了燎含。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腿短,死狀恐怖瘫镇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情答姥,我是刑警寧澤铣除,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站鹦付,受9級(jí)特大地震影響尚粘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敲长,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一郎嫁、第九天 我趴在偏房一處隱蔽的房頂上張望秉继。 院中可真熱鬧,春花似錦泽铛、人聲如沸尚辑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杠茬。三九已至,卻和暖如春弛随,著一層夾襖步出監(jiān)牢的瞬間瓢喉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工舀透, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栓票,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓愕够,卻偏偏與公主長(zhǎng)得像走贪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惑芭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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