前言
我們都知道iOS的UITableView有自帶的 左滑動刪除的方式,此中方式中,不論是刪除數據源,還是刪除對應的Cell都是很簡單的。可是有時候,產品不是通過滑動刪除的,而是點擊Cell上的刪除圖標。本文就是小結一下,商品錄入時 UITableViewCell的使用。
-
** 關于Cell的高度問題**
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { #關于Cell的高度問題我們可以使用一些第三方的布局框架達到,這里使用的是 CellModel 的屬性值記錄的方法, #也失為一種方法,使 Cell本身有了修改自己高度的能力。更改完后,刷新指定行即可。 GetMateralCellModel *cellModel =cellModelArray[indexPath.row]; return cellModel.cellHeight; }
關于添加Cell
// 添加商品
- (void)toAddGoods
{
NSIndexPath cellPath = [NSIndexPath indexPathForRow:cellNumebr inSection:0];
# cellNumebr這個值設置為一直增加的值,確保每個 cellNumebr值都是唯一的值。
cellNumebr++;
# 增加CellModel,并把 此時的 cellNumebr賦值給 CellModel。
[self addCellModel];
# 插入一條Cell
[self.Tb insertRowsAtIndexPaths:[NSArray arrayWithObjects:cellPath, nil] withRowAnimation:UITableViewRowAnimationNone];
# 增加動態添加的動畫
if (cellNumebr<4) {#小于4個不需要位移(此時還未滿屏,不需要自動上移)
return;
}
[UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
[self.Tb setContentOffset:CGPointMake(0, Scale_Y((160(cellNumebr-3))+70))];
} completion:^(BOOL finished) {}];
}關于刪除Cell
# 首先我們知道,如果給Cell的tag,通過 indexPath.row 賦值的話,然后通過獲取到要刪除的Cell的tag來進行刪除操作時,肯定會出錯的。
# 刪除第二個Cell,成功了,沒問題。可是當我們再次刪除此時的 第二個(也就是原來的第三個)Cell時,就會出問題了。
# 因為此時被刪除的那個Cell的Tag是2,于是我們就移除了 indexPath.row 為2的Cell,可是此時被刪除的這個Cell其實在 1的位置,于是我們就刪錯了。
# 通過上圖,我們獲得了刪除某個Cell 時正確邏輯:
# (1) 首先每個Cell都有一個 CellModel,每個CellModel都有一個值,每次刪除一個Cell時,查找 dataArray里面的 CellModel,
# 如果哪個CellModel的值跟 當前Cell的CellModel的值一樣的話。記錄下它在數組中的 下標 X,移出數組,
# 然后Tb再刪除 indexPath.row 為X的Cell就不會有問題了。
# (2) 其實可以這樣,每次刪除一個Cell時,查找 dataArray里面的 CellModel,哪個CellModel跟 Cell的CellModel一樣時,記錄下它在數組中的 下標 X,移出數組,
# 然后Tb再刪除 indexPath.row 為X的Cell就不會有問題了。
NSIndexPath *cellPath = [NSIndexPath indexPathForRow:(cellTag) inSection:0];
[self.Tb deleteRowsAtIndexPaths:[NSArray arrayWithObjects:cellPath, nil] withRowAnimation:UITableViewRowAnimationAutomatic];
-
提交所有錄入的數據
遍歷 dataArray里面的 CellModel,獲取到每個Cell的數據,提交上傳即可。**無法通過cellForRowAtIndexPath 的方法獲取到所有的Cell的錄入數據,因為這個方法只能獲取到,出現在屏幕中的Cell,對于那些未出現的Cell里的數據是無法獲取的(也沒有,或因為復用導致之前的數據而不復存在) **
需要注意的事
UITableViewCell 在復用的時候,由于沒有被銷毀,所以里面的全局變量都是存在并保留之前的狀態值的,我們在每次使用前都需要對 屬性值或者全局變量進行 Model賦值或者 置空(nil)的操作。
# 如果我們不在Cell復用的時候對 屬性值或者全局變量進行 Model賦值或者 置空的話,我們下面的操作就會有問題。
# 因為如果當前Cell是沒有 storageMode的,可是復用前的Cell有storageMode。我們沒有對 當前 存留的storageMode 進行 nil操作,
# 下面的邏輯就會有問題了。
if (storageMode) {
storageMode.selected = NO;
}
storageMode =(StorageGoodsMode*)dataDic[@"data"];
storageMode.selected = YES;
小結
如果這些問題都注意了,錄入商品的時候關于UITableCell的操作會少走很多彎路。