仿京東購(gòu)物車iOS

忙里偷閑,把之前寫(xiě)好的商城購(gòu)物車整理下給大家分享〈植罚現(xiàn)在上面有很多的購(gòu)物車,個(gè)人感覺(jué)寫(xiě)的不是很完整纳击,這里補(bǔ)充了一些续扔。先上圖攻臀,說(shuō)下簡(jiǎn)單的邏輯

示意圖.png

購(gòu)物車的邏輯基本主要是在選中對(duì)應(yīng)產(chǎn)品,根據(jù)產(chǎn)品數(shù)量和選中的產(chǎn)品去更改對(duì)應(yīng)價(jià)格纱昧。這個(gè)思路理清了就很簡(jiǎn)單了刨啸。在這個(gè)基礎(chǔ)上我的demo仿照京東做了個(gè)編輯。編輯模式下商品的選擇是跟非編輯模式是不干擾的识脆。下面上代碼

NSString*pathStr = [[NSBundle mainBundle] pathForResource:@"YSDota" ofType:nil];
    NSData* data = [NSData dataWithContentsOfFile:pathStr];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    
    NSArray * array = json[@"group_goods_cart"];
    for (NSDictionary* list in array) {
        MKOrderListModel* obj = [MKOrderListModel mj_objectWithKeyValues:list];
        [self.dateArray addObject:obj];
        
    }

先獲取數(shù)據(jù)设联,上面代碼是本地的數(shù)據(jù)。同學(xué)們接入的時(shí)候替換成自己的就行了

//判斷組的是否選中狀態(tài)是否修改
    NSString * cellTagStr = [NSString stringWithFormat:@"%zd",shopCellTag];
    NSIndexPath *indexPath = self.dic[cellTagStr];
    
    MKOrderListModel * listModel = (MKOrderListModel*)self.dateArray[indexPath.section];
    //0.便利當(dāng)前組cell上選中按鈕的個(gè)數(shù)
    NSInteger seletedNum =0;
    for (MKGoodsModel* goodsModel in listModel.goods) {
        if (goodsModel.isSelected) {
            seletedNum += 1;
        }
        // 1.當(dāng)前組的cell的個(gè)數(shù) 是否等于 勾選的總數(shù)
        if (((MKOrderListModel*)self.dateArray[indexPath.section]).goods.count == seletedNum) {
            listModel.groupSelected = YES; //cell改變組頭變?yōu)檫x中
            //判斷  //cell改變組頭 //組頭改變?nèi)x
            NSInteger selectedNum = 0 ;
            for (MKOrderListModel * tempListModel in self.dateArray) {//遍歷所有組
                if (tempListModel.groupSelected) {//如果組頭是選中的
                    selectedNum += 1;
                }
                if (selectedNum == self.dateArray.count) {
                    [_footView setDotType:YES];
                }
            }
        } else {
            listModel.groupSelected = NO;
            [_footView setDotType:NO];
        }
        [_shopTable reloadData];
    }
    
    // 計(jì)算價(jià)格
    MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[indexPath.section]).goods[indexPath.row];
    float goods_price = goodsModel.goods_price;
    float goods_number = goodsModel.goods_number;
    if (!goodsModel.isSelected) {
        
        _totalNum -= goods_price*goods_number;
        
    }else {
        
        _totalNum+= goods_price*goods_number;
        
    }
    [_footView setSettlementPrice:[NSString stringWithFormat:@"¥%.2f",_totalNum -1 + 1]];

這里是主要的邏輯存璃,主要是通過(guò)判斷區(qū)的選中的狀態(tài)或者個(gè)別商品的選中狀態(tài)去改變對(duì)于商品的價(jià)格仑荐。這里就不詳細(xì)說(shuō)了 ,同學(xué)們自己看demo纵东,文章末尾上鏈接粘招。(有疑問(wèn)或者發(fā)現(xiàn)有誤的可以相互交流)

最后面就是編輯狀態(tài):
在進(jìn)入編輯狀態(tài)的時(shí)候取出對(duì)應(yīng)商店里選中的商品(注意:demo中的商品是通過(guò)商品的ID作為key,一定要唯一值不然可能或出現(xiàn)商品錯(cuò)亂)存放是以字典形式存放在數(shù)組中偎球、當(dāng)用戶點(diǎn)擊完成后返回非編輯模式洒扎,在通過(guò)數(shù)組遍歷,根據(jù)字典里面的key判斷商品是否被選中衰絮,選中的改變商品選中狀態(tài)袍冷。

sender.selected = !sender.selected;
    if (sender.selected) { // 進(jìn)入編輯狀態(tài) 記錄原數(shù)據(jù) 清空選中狀態(tài)
        
        [_rightEditor setTitle:@"完成" forState:(UIControlStateNormal)];
        [self.rowArray removeAllObjects];
        // 點(diǎn)擊編輯清除所有狀態(tài)
        [self changShopGoodblack:^(NSInteger section, NSInteger row) {
            
            MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
            
            if (goodsModel.isSelected) { //   記錄選中的商品 (選唯一值作為判斷 一般商品id都是唯一的)
                
                if (![self.rowArray containsObject:goodsModel.goods_id]) {
                    [self.rowArray addObject:[NSString stringWithFormat:@"%ld-%@",(long)section,goodsModel.goods_id]];
                }
                
            }
            goodsModel.isSelected = NO;
            [self shopCellSelectedClicksection:section row:row];
        }];
        // 隱藏價(jià)格刷新數(shù)據(jù)
        [_footView sethiddenViewWithPrice:YES settle:@"刪除"];
        [_footView sethiddenViewWithCollectionButton:NO];
        [_shopTable reloadData];
        
    }else {
        
        // 清除價(jià)格重新計(jì)算
        _totalNum = 0;
        [_rightEditor setTitle:@"編輯" forState:(UIControlStateNormal)];
        // 重新計(jì)算商品之前先清除所有收藏的選中狀態(tài)
        [self changShopGoodblack:^(NSInteger section, NSInteger row) {
            
            MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
            goodsModel.isSelected = NO;

        }];
        // 回復(fù)購(gòu)物車原來(lái)選中的商品
        [self changShopGoodblack:^(NSInteger section, NSInteger row) {
            
            MKGoodsModel *goodsModel = ((MKOrderListModel*)self.dateArray[section]).goods[row];
            for (NSString *selectGood in self.rowArray)
            {
                NSArray *good_p = [selectGood componentsSeparatedByString:@"-"];
                // 判斷對(duì)應(yīng)的分區(qū)
                if ([good_p[0]integerValue] == section)
                {
                    // 判斷對(duì)應(yīng)分區(qū)的商品id(商品在編輯狀態(tài)時(shí)可能已被刪除)
                    if ([good_p[1] isEqualToString:goodsModel.goods_id])
                    {
                        goodsModel.isSelected = YES;
                    }
                }
            }
            [self shopCellSelectedClicksection:section row:row];
        }];
        [_footView sethiddenViewWithPrice:NO settle:@"結(jié)算"];
        [_footView sethiddenViewWithCollectionButton:YES];
        [_shopTable reloadData];
    }

當(dāng)然如果你有好的方式也可以跟大家分享下。
根據(jù)我對(duì)京東APP的觀察猫牡,他們的商品數(shù)據(jù)選中狀態(tài)胡诗,數(shù)量改變等都是通過(guò)服務(wù)端存儲(chǔ)的,前端只需要傳值然后更新對(duì)應(yīng)的cell就行了淌友。demo里面選中狀態(tài)那樣寫(xiě)是因?yàn)槲覀冞@邊的服務(wù)端不愿去做這些繁雜的東西煌恢。所以寫(xiě)得并不是很完整,大家可根據(jù)自己需求去小改下震庭。
最后--------------------https://gitee.com/xpyt/goodscart/tree/master

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑰抵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子器联,更是在濱河造成了極大的恐慌二汛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拨拓,死亡現(xiàn)場(chǎng)離奇詭異肴颊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)渣磷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)苫昌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事祟身“挛瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵袜硫,是天一觀的道長(zhǎng)氯葬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)婉陷,這世上最難降的妖魔是什么帚称? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮秽澳,結(jié)果婚禮上闯睹,老公的妹妹穿的比我還像新娘。我一直安慰自己担神,他們只是感情好楼吃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著妄讯,像睡著了一般孩锡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亥贸,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天躬窜,我揣著相機(jī)與錄音,去河邊找鬼炕置。 笑死荣挨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的朴摊。 我是一名探鬼主播垦沉,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仍劈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起寡壮,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贩疙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后况既,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體这溅,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年棒仍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悲靴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莫其,死狀恐怖癞尚,靈堂內(nèi)的尸體忽然破棺而出耸三,到底是詐尸還是另有隱情雇寇,我是刑警寧澤而钞,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站湿酸,受9級(jí)特大地震影響胳徽,放射性物質(zhì)發(fā)生泄漏积锅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一养盗、第九天 我趴在偏房一處隱蔽的房頂上張望缚陷。 院中可真熱鬧,春花似錦往核、人聲如沸箫爷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝶缀。三九已至,卻和暖如春薄货,著一層夾襖步出監(jiān)牢的瞬間翁都,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工谅猾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄慰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓税娜,卻偏偏與公主長(zhǎng)得像坐搔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敬矩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評(píng)論 25 707
  • 親愛(ài)的兒子概行,我知道現(xiàn)在你已經(jīng)睡了,爸爸不在你身邊你總是睡得很早弧岳。酒店的床很舒服凳忙,我卻總翻來(lái)覆去睡不著。怪我睡前不該...
    晃晃悠悠的招財(cái)貓閱讀 1,375評(píng)論 4 33
  • 肆月_閱讀 148評(píng)論 0 1
  • 2016-10-21 原文:愛(ài)因斯坦說(shuō)過(guò)禽炬,每個(gè)人都身懷天賦涧卵,如果以不會(huì)爬樹(shù)來(lái)評(píng)判一條魚(yú),它會(huì)終其一生都以為自己愚蠢...
    請(qǐng)叫我四爺閱讀 803評(píng)論 0 1
  • 時(shí)間腹尖,聯(lián)系柳恐,結(jié)構(gòu),運(yùn)動(dòng),是存在的基礎(chǔ)屬性 觀察與遠(yuǎn)見(jiàn) 遇強(qiáng)則強(qiáng)乐设,你只差一個(gè)敵人 把你所要學(xué)的東西當(dāng)成你的敵人讼庇,然后...
    百川樹(shù)閱讀 63評(píng)論 0 1