兩個(gè)代理方法實(shí)現(xiàn)iOS購(gòu)物車2-完整版

首頁(yè)圖

上次寫(xiě)完購(gòu)物車精簡(jiǎn)版被編輯推薦到了首頁(yè),得到許多朋友關(guān)注,評(píng)論區(qū)小伙伴建議做一個(gè)完整版.于是利用閑暇時(shí)間新增了一些功能:

  • 數(shù)量加減
  • 可點(diǎn)擊textField修改,也可以加減按鈕修改
  • 全選按鈕

github代碼:https://github.com/zhYes/YSShoppingCar-Complite.git

全選按鈕邏輯效果:

全選效果展示

part one 全選按鈕有關(guān)代碼

代理方法1中偽代碼:

#pragma mark - cell上的代理方法
- (void)shopCellSelectedClick:(NSInteger)shopCellTag {
....
///插入判斷代碼
//判斷  //cell改變組頭 //組頭改變?nèi)x
            NSInteger selectedNum = 0 ;
            for (MKOrderListModel * tempListModel in _modelArray) {//遍歷所有組
                if (tempListModel.groupSelected) {//如果組頭是選中的
                    selectedNum += 1;
                }
                if (selectedNum == _modelArray.count) {
                    allSelectBtn.selected = YES;
                }
            }
        } else {
            listModel.groupSelected = NO;
            allSelectBtn.selected = NO;
        }
....
}

cell的選中增加了判斷代碼,決定全選按鈕的狀態(tài)

完整代碼:

#pragma mark - cell上的代理方法獲 | 取的價(jià)格
- (void)shopCellSelectedClick:(NSInteger)shopCellTag {
    
    //判斷組的是否選中狀態(tài)是否修改
    NSString * cellTagStr = [NSString stringWithFormat:@"%zd",shopCellTag];
    NSIndexPath *indexPath = self.dic[cellTagStr];
    MKOrderListModel * listModel = (MKOrderListModel*)_modelArray[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*)_modelArray[indexPath.section]).goods.count == seletedNum) {
            listModel.groupSelected = YES; //cell改變組頭變?yōu)檫x中
            //判斷  //cell改變組頭 //組頭改變?nèi)x
            NSInteger selectedNum = 0 ;
            for (MKOrderListModel * tempListModel in _modelArray) {//遍歷所有組
                if (tempListModel.groupSelected) {//如果組頭是選中的
                    selectedNum += 1;
                }
                if (selectedNum == _modelArray.count) {
                    allSelectBtn.selected = YES;
                }
            }
        } else {
            listModel.groupSelected = NO;
            allSelectBtn.selected = NO;
        }
        [_tableView reloadData];
    }
    
    MKGoodsModel *goodsModel = ((MKOrderListModel*)_modelArray[indexPath.section]).goods[indexPath.row];
    float goods_price = goodsModel.goods_price;
    float goods_number = goodsModel.goods_number;
    if (!goodsModel.isSelected) {
        _totalNum = _totalNum - goods_price*goods_number;
//        NSLog(@"%.2f",_totalNum);
        
    }else {
        
        _totalNum = _totalNum + goods_price*goods_number;
//        NSLog(@"%.2f",_totalNum);
    }
    _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum -1 + 1];
    if ([_hejiLabel.text containsString:@"-"]) {
        _hejiLabel.text = @"¥0.0";
    }
}

當(dāng)前cell選中時(shí)候,當(dāng)前組頭也選中的時(shí)候,判斷當(dāng)前所有選中組的個(gè)數(shù)是否等于全部組數(shù)

代理方法2中偽代碼:

#pragma mark - 代理方法組頭header的選中狀態(tài)
- (void)headerSelectedBtnClick:(NSInteger)section {
...
插入判斷
// 判斷如果點(diǎn)擊 | header選中
    if (listModel.groupSelected) {

        //    /// 判斷組頭的點(diǎn)擊改變?nèi)x按鈕
        NSInteger tempGroupSelectNum = 0;
        for (MKOrderListModel *model in _modelArray) {
            if (model.groupSelected) {
                tempGroupSelectNum ++;
            }
            if (tempGroupSelectNum == _modelArray.count) {
                allSelectBtn.selected = YES;
            }
        }
...
}

數(shù)組的選中按鈕中增加判斷

完整代碼:

#pragma mark - 代理方法組頭header的選中狀態(tài)
- (void)headerSelectedBtnClick:(NSInteger)section {
    //    NSLog(@"%zd",section);
    MKOrderListModel*listModel = _modelArray[section];
    listModel.groupSelected = !listModel.groupSelected;

    
    // 判斷如果點(diǎn)擊 | header選中
    if (listModel.groupSelected) {
        
        //    /// 判斷組頭的點(diǎn)擊改變?nèi)x按鈕
        NSInteger tempGroupSelectNum = 0;
        for (MKOrderListModel *model in _modelArray) {
            if (model.groupSelected) {
                tempGroupSelectNum ++;
            }
            if (tempGroupSelectNum == _modelArray.count) {
                allSelectBtn.selected = YES;
            }
        }
        
        
        for (MKGoodsModel* goodsModel in listModel.goods) {
            
            if (!goodsModel.isSelected) {                                       //下面不是選中狀態(tài)的cell 將價(jià)格加入到總價(jià)當(dāng)中
                float goods_price = goodsModel.goods_price;               //價(jià)格
                float goods_number = goodsModel.goods_number;   // 數(shù)量
                _totalNum += goods_price * goods_number;
                goodsModel.isSelected = YES;
            }
            
        }
    } else {  // 取消header選中 所有都取消
        //全選按鈕變?yōu)椴贿x中
        allSelectBtn.selected = NO;
        for (MKGoodsModel* goodsModel in listModel.goods) {
            goodsModel.isSelected = NO;
            float goods_price = goodsModel.goods_price;               //價(jià)格
            float goods_number = goodsModel.goods_number;   // 數(shù)量
            _totalNum -= goods_price * goods_number;
        }
    }
//    NSLog(@"總價(jià)格為: %.2f",_totalNum);
    _hejiLabel.text = [NSString stringWithFormat:@"¥%.2f",_totalNum - 1 + 1];
    if ([_hejiLabel.text containsString:@"-"]) {
        _hejiLabel.text = @"0";
    }
    [_tableView reloadData];
}

全選按鈕的點(diǎn)擊處理:

/// MARK: 全選的點(diǎn)擊事件
- (void)allSelectBtnClick: (UIButton*)allSelectedBtn{
    allSelectedBtn.selected = !allSelectedBtn.selected; // 修改全選按鈕的狀態(tài)
    if (allSelectedBtn.selected) { // 如果全選按鈕改變了為選中
        
        for (int i = 0; i <_modelArray.count; i ++) {
            MKOrderListModel * listModel = _modelArray[i];
            if (!listModel.groupSelected) {//遍歷如果組不是選中狀態(tài)
                [self headerSelectedBtnClick:i]; //模擬組頭點(diǎn)擊了一次
                
            }
        }
    }else { // 全選按鈕改變?yōu)椴贿x中 那么所有商品都不選中!
        for (int i = 0; i < _modelArray.count; i ++) { // 遍歷所有的組頭點(diǎn)擊
            [self headerSelectedBtnClick:i];
        }
    }
}

點(diǎn)擊全選,按鈕狀態(tài)取反
取反后,全選按鈕是選中,則遍歷所有組把所有未選中的組頭做一次點(diǎn)擊操作
取反后,全選按鈕是未選中,則所有組頭做一次點(diǎn)擊操作即可

修改數(shù)量效果展示:

修改數(shù)量效果

part two 修改數(shù)量相關(guān)代碼:

關(guān)于購(gòu)物車中textField的邏輯代碼可查看我的另一篇記用了12個(gè)if做的textField輸入框的變態(tài)需求
這里貼一下數(shù)量加減的代碼:

/// MARK:數(shù)量增加按鈕
- (IBAction)plusBtnClick {
    if (_ex_buynum_texField.editing) {
        return;
    }
    // 保存之前值
    float beforeBuyNum = _goodsModel.goods_number;
    // 判斷不能大于20
    if (_ex_buynum_texField.text.floatValue == 20) {
        return;
    }
    /// 修改模型數(shù)據(jù)
    _ex_buynum_texField.text = [NSString stringWithFormat:@"%.1f",_ex_buynum_texField.text.floatValue + 0.5];
    _goodsModel.goods_number = _ex_buynum_texField.text.floatValue;
    if ([self.shopDelegate respondsToSelector:@selector(shopCellEndEditerClick:beforeBuyNum:)]) {
        [self.shopDelegate shopCellEndEditerClick:self.tag beforeBuyNum:beforeBuyNum];
    }
    /// 傳遞給服務(wù)器 一會(huì)寫(xiě) $$$$$$$$
}
- (IBAction)reduceBtnClick {
    if (_ex_buynum_texField.editing) {
        return;
    }
    // 保存之前值
    float beforeBuyNum = _goodsModel.goods_number;
    // 判斷不能小于0.5
    if (_ex_buynum_texField.text.floatValue == 0.5) {
        return;
    }
    /// 修改模型數(shù)據(jù)
    _ex_buynum_texField.text = [NSString stringWithFormat:@"%.1f",_ex_buynum_texField.text.floatValue - 0.5];
    _goodsModel.goods_number = _ex_buynum_texField.text.floatValue;
    if ([self.shopDelegate respondsToSelector:@selector(shopCellEndEditerClick:beforeBuyNum:)]) {
        [self.shopDelegate shopCellEndEditerClick:self.tag beforeBuyNum:beforeBuyNum];
    }
    /// 傳遞給服務(wù)器 一會(huì)寫(xiě) $$$$$$$$
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,986評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,204評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,964評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,354評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,554評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,918評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,093評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,342評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,755評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,009評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,839評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,107評(píng)論 2 375

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