購物車的邏輯及處理

********《MVC模式下的購物車》********

ViewController: 購物車界面

整個界面就是TableView?+ 底部結賬欄View組成

以店鋪為section:商店下的商品為row和店鋪名稱組成一個 section

定制段頭的View 把section的全選按鈕、點擊商品、編輯的三個按鈕全部裝起來,里面點擊的方法用代理的方法。

-(UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section;

這是加載自定義段頭的代理方法。

頭視圖的代理方法

建議使用Masonry進行cell適配

cell的創建就是和我們平常的一樣,把要展示的樣式代碼編寫或者xib都可以。再把數據源填充到我們所創建好的cell中和段頭上。

使用masonry進行適配會省去我們要考慮的label換行及各類UI適配問題,切記在寫約束時不要寫高度。

創建好一個View添加在TableView的下方。View上寫上全選及總金額等UI。每次我們選定的物品的增減都要調用該View賦值的方法,刷新金額等字段顯示。

計算所選中物品的總價格

Cell:物品欄

創建兩種cell,一個是正常的物品顯示cell,另一個cell是編輯后的cell。

正常的cell:只說下label中劃線的實現

//中劃線

NSDictionary *attribtDic = @{NSStrikethroughStyleAttributeName: [NSNumber numberWithInteger:NSUnderlineStyleSingle]};

NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc]initWithString:info[@"GoodsOldPrice"] attributes:attribtDic];

// 賦值

_Goods_OldPrice.attributedText = attribtStr;

編輯后的cell:

主要由三部分組成。商品數量 + 商品種類 + 刪除

編輯商品信息

商品數量用的是第三方PPNumberButton,點擊時改變model中該商品的實際數量;點擊商品種類進行重新選擇(方法未實現,原理一樣);點擊刪除進行cell的刪除及數據源的刪除。

注釋:這里的刪除 及 修改 都是要對數據源進行修改在刷新的

Model:數據源的處理及購物車內各類按鈕的判斷

demo中的數據源我沒有放到model中去處理,其實原理都一樣,我把判斷各類按鈕的判斷字段加到數據源中去了,如果用model模型的話,自己加上相對應的字段,并設置初始值。當進行model數據源的修改時,直接進行修改。

model

這是一種model處理方式,還有一種就是用JsonModel來處理,一層層的寫下來,原理一樣。

購物車邏輯及實現總結

邏輯整理:當我們把有購買意向的物品加到購物車后,我們在購物車中調用接口獲取購物車中的物品信息。數據源格式大概是(感覺不怎么對,但是能理解就行)

[

{@“店鋪信息”:[@{物品信息},@{物品信息},@{物品信息}]},? -------》組一

{@"店鋪信息":[@{物品信息}]},? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -------》組二

{@”店鋪信息“:[@{物品信息},@{物品信息}]}? ? ? ? ? ? ? ? ? ? ? ? -------》組三

]

把數據源用model裝起來,把數據填充到tableview中去。

1.單個商品的選擇、單個店鋪內所有商品的選擇、結賬欄下的全選 ? ? ? ? ? ? ? ? ? ? ?

如果做得很簡單的話,可以直接用系統的單選和全選方法。

最重要的兩句 !!!!

TableDemo.editing=YES;? ? ? 編輯狀態

TableDemo.allowsMultipleSelectionDuringEditing=YES; ? 編輯的時候多選

cell.tintColor= [UIColorredColor]; ? 選中后的顏色

選中和取消選中

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath ? ?選中

-(void)tableView:(UITableView*)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath ? ?取消選中

如果不用系統的話,則利用model來進行單選和全選的操作,選中和取消選中對model中的判斷字段進行修改,刷新當前cell或者section。

//一個section刷新

NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:section];

[tableview reloadSections:indexSet

withRowAnimation:UITableViewRowAnimationAutomatic];

//一個cell刷新

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:row inSection:section];

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];

這里需要注意的是,每次單選和全選的時候,需要對底部結賬欄進行數據的刷新,并且單選完整組后,需要對section上的按鈕進行選中狀態變化,當選中section時,同樣需要對section下的row進行選中狀態,如果全部商品選中,還得需要改變結賬欄的狀態。(這里其實不難,無非就是對model中各類字段進行改變,再刷新,同時判斷選中數量的多少來進行按鈕的狀態變換)

2.刪除單個商品

刪除的話就相對容易了,直接對數據源刪除對應的row,當只剩一個后,刪除該數據后,記得刪除該組section不然報錯。刪除后及時刷新底部結賬欄金額顯示。

3.編輯section

點擊編輯按鈕,修改model,展示編輯cell。編輯按鈕上放了數量計數器、商品的信息、刪除。

計數器:用到的是好友的一個庫PPNumberButton 喜歡的大家可以去玩玩。點擊后用代理方法把數量的變化跟新model。

商品信息:點擊對商品的信息進行重新選擇,同樣修改數據源。

刪除:代理出來進行model的修改。

因為這里用的是假數據,所以進行的都是對數據源的修改,正常情況下,原理都一樣,可以在次基礎上,如果接口成功,就對本地數據進行修改,最后提交的信息會和后臺匹配一次的,如果有問題,可以自己修改一下。

有小伙伴提出demo中沒有下拉刷新,其實下拉刷新不影響該demo。不過加上效果更好。

謝謝“愛在巴黎夢醒時”該小伙伴。


demo的bug注釋:

因為demo中判斷section的全選和編輯的按鈕都是放在每個section的第一個row中的,所以刪除section的第一個row后,會有全選和編輯的固定bug出來。特此聲明,該bug不影響主體邏輯,如次bug影響小伙伴對邏輯思路的學習,那我后面再重新組織數據源。

更新:

1.在刷新底部結賬欄的總金額時,同時跟新全選狀態。(及底部結賬欄的UI都要統一刷新一次)

demo純代碼編寫的,只隔離了部分模塊,因為我也是拿來練練手,所以如果有需要,后續我會把購物車模塊化。如果內容有不妥和臃腫的地方,大家可以提出來,我及時學習并修改。如果大家有意見的可以@我1804094055qq.com。如果覺得可以請大家不吝star。

https://github.com/zl645420646/-ZLShoppingCart

效果圖
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容