********《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處理方式,還有一種就是用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