iOS 多級(jí)分類(lèi)菜單 多級(jí)列表 仿口碑分類(lèi)菜單 電商篩選菜單

ClassifyMenuDemo

多級(jí)分類(lèi)菜單 多集列表展開(kāi)合并 仿口碑分類(lèi)效果

ClassifyMenuDemo 簡(jiǎn)單使用 無(wú)入侵 對(duì)原項(xiàng)目無(wú)污染

分類(lèi)菜單 篩選菜單 口碑分類(lèi)篩選菜單 電商通用篩選菜單 多級(jí)列表


效果演示 源碼公開(kāi) 可以隨意修改成你喜歡的樣子

分類(lèi)菜單演示.gif


使用方法:

- (void)clickTitleBtn:(UIButton *)sender {
    if (self.isShowMenu == NO) {
        WEAKSELF
        self.rootNode = [self doConfigNodes]; // 整理數(shù)據(jù)
        self.menu = [[ClassifyMenu alloc] initWithFrame:CGRectZero rootNode:self.rootNode chooseResult:^(CMNode *node) {
            weakSelf.isShowMenu = NO;
            NSString *result = @"";
            if (node.depth == 0) {
                // 一級(jí)終結(jié)
                result = [NSString stringWithFormat:@"%@", node.name];
            }else if (node.depth == 1) {
                // 二級(jí)終結(jié)
                result = [NSString stringWithFormat:@"%@-%@", node.parentNode.name, node.name];
            }else if (node.depth == 2) {
                // 三級(jí)終結(jié)
                result = [NSString stringWithFormat:@"%@-%@-%@", node.parentNode.parentNode.name, node.parentNode.name, node.name];
            }
            NSLog(@"選擇的結(jié)果:%@", result);
            self.resultLabel.text = result;
        } closeMenuAction:^{
            weakSelf.isShowMenu = NO;
        }];
        [self.menu show];
        self.isShowMenu = YES;
    }else {
        self.isShowMenu = NO;
        if (self.menu) {
            [self.menu close];
        }
    }
}

數(shù)據(jù)整理成CMNode類(lèi)集合 按照層次整理 加入只做多級(jí)列表的話 只用左側(cè)的列表,可以做無(wú)數(shù)級(jí),也是按照如下所示的方法整理數(shù)據(jù)格式就行了

#pragma mark - 數(shù)據(jù)格式源整理
- (CMNode *)doConfigNodes {
    NSDictionary *item1 = @{@"name":@"一級(jí)分類(lèi)1", @"arr":@[@{@"name":@"二級(jí)分類(lèi)1", @"arr":@[@{@"name":@"三級(jí)分類(lèi)11"}, @{@"name":@"三級(jí)分類(lèi)22"}, @{@"name":@"三級(jí)分類(lèi)33"}, @{@"name":@"三級(jí)分類(lèi)44"}, @{@"name":@"三級(jí)分類(lèi)55"}]},
                                                       @{@"name":@"二級(jí)分類(lèi)2", @"arr":@[@{@"name":@"游泳館1"}, @{@"name":@"游泳館2"}, @{@"name":@"游泳館3"}, @{@"name":@"游泳館4"}, @{@"name":@"游泳館5"}]},
                                                       @{@"name":@"二級(jí)分類(lèi)3", @"arr":@[@{@"name":@"舞蹈1"}, @{@"name":@"舞蹈2"}, @{@"name":@"舞蹈3"}, @{@"name":@"舞蹈4"}, @{@"name":@"舞蹈5"}]},
                                                       @{@"name":@"親子", @"arr":@[@{@"name":@"少兒才藝"}, @{@"name":@"少兒打架"}, @{@"name":@"科普"}]},
                                                       @{@"name":@"二級(jí)分類(lèi)5", @"arr":@[@{@"name":@"hello1"}, @{@"name":@"hello Kitty"}, @{@"name":@"藍(lán)胖子"}, @{@"name":@"小黑"}, @{@"name":@"大大pan"}]}]};
    NSDictionary *item2 = @{@"name":@"熱門(mén)精選", @"arr":@[@{@"name":@"為你推薦", @"arr":@[@{@"name":@"快餐小吃1"}, @{@"name":@"快餐小吃2"}]}, @{@"name":@"超市", @"arr":@[@{@"name":@"超市1"}, @{@"name":@"超市2"}, @{@"name":@"超市3"}, @{@"name":@"超市4"}, @{@"name":@"超市5"}]}]};
    NSDictionary *item3 = @{@"name":@"休閑娛樂(lè)", @"arr":@[@{@"name":@"彩妝造型1", @"arr":@[@{@"name":@"美發(fā)1"}, @{@"name":@"美發(fā)2"}, @{@"name":@"美發(fā)3"}, @{@"name":@"美發(fā)4"}, @{@"name":@"美發(fā)5"}]}, @{@"name":@"寵物", @"arr":@[@{@"name":@"狗狗1"}, @{@"name":@"狗狗2"}, @{@"name":@"狗狗3"}, @{@"name":@"狗狗4"}, @{@"name":@"狗狗5"}]}]};
    NSDictionary *item4 = @{@"name":@"運(yùn)動(dòng)健身", @"arr":@[@{@"name":@"少林武術(shù)", @"arr":@[@{@"name":@"少林棍1"}, @{@"name":@"少林棍2"}, @{@"name":@"少林棍3"}, @{@"name":@"少林棍4"}, @{@"name":@"少林棍5"}]}, @{@"name":@"峨眉派", @"arr":@[@{@"name":@"白骨爪1"}, @{@"name":@"白骨爪2"}, @{@"name":@"白骨爪3"}, @{@"name":@"白骨爪4"}, @{@"name":@"白骨爪5"}]}]};
    NSDictionary *item5 = @{@"name":@"電影", @"arr":@[@{@"name":@"萬(wàn)達(dá)院1", @"arr":@[@{@"name":@"王思聰1"}, @{@"name":@"王思聰2"}, @{@"name":@"王思聰3"}, @{@"name":@"王思聰4"}, @{@"name":@"王思聰5"}]}, @{@"name":@"萬(wàn)達(dá)院2", @"arr":@[@{@"name":@"IceBear1"}, @{@"name":@"IceBear2"}]}]};
    NSArray *temps = @[item1, item2, item3, item4, item5];
    // 找到已選擇的
    NSArray *temp = [self.resultLabel.text componentsSeparatedByString:@"-"];
    NSString *nodeName1 = @"";
    NSString *nodeName2 = @"";
    NSString *nodeName3 = @"";
    if (temp.count == 1) {
        nodeName1 = temp[0];
    }else if (temp.count == 2) {
        nodeName1 = temp[0];
        nodeName2 = temp[1];
    }else if (temp.count == 3) {
        nodeName1 = temp[0];
        nodeName2 = temp[1];
        nodeName3 = temp[2];
    }
    CMNode *rootNode = [[CMNode alloc] initWithParent:nil expand:NO];
    // 這里可根據(jù)實(shí)際情況進(jìn)行多層級(jí)的列表嵌套,只需要把子節(jié)點(diǎn)添加到父節(jié)點(diǎn)下就可以了。
    // 后面會(huì)根據(jù)實(shí)際的數(shù)據(jù)進(jìn)行UI的設(shè)置
    for (int i = 0; i < temps.count; i++) {
        // 一級(jí)的列表
        CMNode *node = [CMNode initWithParent:rootNode expand:YES];
        node.name = temps[i][@"name"];
        
        if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && i==0) {
            node.isChoosed = YES;
            node.expand = YES;
        }else {
            if ([nodeName1 isEqualToString:node.name]) {
                node.isChoosed = YES;
                node.expand = YES;
            }else {
                node.isChoosed = NO;
                node.expand = NO;
            }
        }
        [rootNode.subNodes addObject:node];
        
        NSArray *twoLevelObjs = temps[i][@"arr"];
        for (int j = 0; j < twoLevelObjs.count; j++) {
            // 二級(jí)列表
            CMNode *subnode = [CMNode initWithParent:node expand:NO];
            subnode.name = twoLevelObjs[j][@"name"];
            
            if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && ISEMPTY(nodeName2) && i==0 && j==0) {
                subnode.isChoosed = YES;
            }else {
                if ([nodeName1 isEqualToString:node.name] && [nodeName2 isEqualToString:subnode.name]) {
                    subnode.isChoosed = YES;
                }else {
                    subnode.isChoosed = NO;
                }
            }
            [node.subNodes addObject:subnode];
            
            NSArray *threeLevelObjs = twoLevelObjs[j][@"arr"];
            for (int k = 0; k < threeLevelObjs.count; k++) {
                // 三級(jí)的列表 (整理后放右側(cè)陳列)
                CMNode *threeNode = [CMNode initWithParent:subnode expand:NO];
                threeNode.name = threeLevelObjs[k][@"name"];
                if ((ISEMPTY(self.resultLabel.text) || [nodeName1 isEqualToString:@"全部類(lèi)目"]) && i==0 && j==0 && k==0) {
                    threeNode.isChoosed = YES;
                }else {
                    if ([nodeName1 isEqualToString:node.name] && [nodeName2 isEqualToString:subnode.name] && [nodeName3 isEqualToString:threeNode.name]) {
                        threeNode.isChoosed = YES;
                    }else {
                        threeNode.isChoosed = NO;
                    }
                }
                [subnode.threeNodes addObject:threeNode];
            }
        }
    }
    return rootNode;
}

如有更好的建議歡迎加Q吐槽:1131991303

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,291評(píng)論 4 61
  • 2018年春節(jié)的時(shí)候。我對(duì)電視、麻將這些都不感興趣,除了宅在家里做飯,就上上網(wǎng)。不去看八卦游戲什么的,主要...
    王敏是男士閱讀 451評(píng)論 0 1
  • 親情是黑暗中的一束光,讓我們感受到生活還有一絲希望;親情是寒冷中的一把火,讓我們感受到生活還不是那么冷酷親情...
    邂逅mhy閱讀 154評(píng)論 0 0
  • 前段時(shí)間,喜歡上了夜跑。 上完晚自習(xí),一個(gè)人,戴上耳機(jī),聽(tīng)著遠(yuǎn)近電臺(tái)的主持人這么遠(yuǎn)那么近的略帶性感的聲音,在我耳邊...
    小小簡(jiǎn)單閱讀 1,470評(píng)論 0 3
  • 我們住在墨大附近的公寓,公寓里面住的大部分是中國(guó)留學(xué)生,和他們聊起天時(shí),發(fā)現(xiàn)他們:首先人很好,,對(duì)人非常...
    沁墨m閱讀 183評(píng)論 0 0

友情鏈接更多精彩內(nèi)容