实时计算MVC列表页里的元素总和

或多或少大家都会遇到这样的困扰, 我们使用了 MVC 去解决列表这类数据问题,但是文本输入框的代理使用却有点....

我们需要前台去计算总计比例值,当更改任意一项都要随时更新总计值, 这个时候我选择了文本编辑结束时调用的时候发送通知去更新总计数据.

Step1. Model里去添加一个属性

键盘文本输入框里的值strRatio, 当未碰触键盘,文本输入框值就默认为上次参数里的比例值(这里是以空对象做判断的)

// 修改比例里的文本输入框值(手动添加)
// 小猪/妊娠猪
@property (nonatomic, copy) NSString *strRatio;

// 比例值(接口返回)
// 小猪/妊娠猪
@property (nonatomic, copy) NSString *ratio;
- (NSString *)strRatio {
    
    if ([_strRatio isEqual:[NSNull null]] || _strRatio == nil) {
        _strRatio = _ratio;
    }
    
    return _strRatio;
}

Step2. 在cell 里的textField编辑结束时调用的时候发送通知

- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"输入了原料比例%@", textField.text);
    
    if (textField == self.pig1) {
        
        self.pig1.text = [NSString stringWithFormat:@"%@", textField.text];
        self.model.strRatio = [NSString stringWithFormat:@"%@", textField.text];
    } else if (textField == self.pig2) {
        
        self.pig2.text = [NSString stringWithFormat:@"%@", textField.text];
        self.model.strRatio2 = [NSString stringWithFormat:@"%@", textField.text];
    } else if (textField == self.pig3) {
        
        self.pig3.text = [NSString stringWithFormat:@"%@", textField.text];
        self.model.strRatio3 = [NSString stringWithFormat:@"%@", textField.text];
    }
    dispatch_async(dispatch_get_main_queue(), ^{
        [XHHNotificationCenter postNotificationName:@"pigModFormula" object:nil userInfo:nil];
    });
}

Step3. 在当前控制器Controller 里接收通知去添加方法

方法里循环比例值去算总和,页面需要刷新时仅仅刷新总计的分区就好,否则会刷新掉刚才输入的数据

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gainTextStr) name:@"pigModFormula" object:nil];
#pragma mark - 计算总计值

- (void)gainTextStr {
    
    // 原料的比例总计和
    self.total1 = 0;
    self.total2 = 0;
    self.total3 = 0;
    
    NSMutableArray *strRatioArray1 = [self.list valueForKeyPath:@"strRatio"];
    NSMutableArray *strRatioArray2 = [self.list valueForKeyPath:@"strRatio2"];
    NSMutableArray *strRatioArray3 = [self.list valueForKeyPath:@"strRatio3"];

    for (NSInteger i = 0; i < self.list.count; i++) {
        self.total1 = self.total1 + [strRatioArray1[i] integerValue];
        self.total2 = self.total2 + [strRatioArray2[i] integerValue];
        self.total3 = self.total3 + [strRatioArray3[i] integerValue];
    }
    
    // 刷新总计
    if (self.rawMaterialList.count > 0) { // 仅仅刷新一个section
        
        NSIndexSet *indexSet = [[NSIndexSet alloc]initWithIndex:2];
        [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
    } else {
        NSIndexSet *indexSet = [[NSIndexSet alloc]initWithIndex:1];
        [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    
}

Step4. 当前控制器里总计totalCell赋值,刷新界面

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
            
            XHHInputFormulaCell *cell = [[XHHInputFormulaCell alloc] init];
            if (self.list.count != 0) {
                
                XHHUserFormulaModel *model = self.list[indexPath.row];
                cell.model = model;
                cell.delegate = self;
            }
            
            return cell;
            
        } else {
            
            XHHTotalFormulaCell *totalCell = [XHHTotalFormulaCell cellWithTableView:tableView];
            totalCell.total1.text = [NSString stringWithFormat:@"%ld%%", (long)self.total1];
            totalCell.total2.text = [NSString stringWithFormat:@"%ld%%", (long)self.total2];
            totalCell.total3.text = [NSString stringWithFormat:@"%ld%%", (long)self.total3];
            
            return totalCell;
        }
}

Step5. 上传比例数据处理

这里和后台的传参方式为字符串且以逗号形式隔开的形式传入,这里只放参数体params

   // 原料的id串
    NSArray *idArray = [self.list valueForKeyPath:@"materialId"];
    NSString *strId = [idArray componentsJoinedByString:@","];
    
    // 原料猪的比例串
    NSArray *strRatioArray = [self.list valueForKeyPath:@"strRatio"];
    NSString *strRatioStr = [strRatioArray componentsJoinedByString:@","];
    
    NSArray *strRatio2Array = [self.list valueForKeyPath:@"strRatio2"];
    NSString *strRatio2Str = [strRatio2Array componentsJoinedByString:@","];
    
    NSArray *strRatio3Array = [self.list valueForKeyPath:@"strRatio3"];
    NSString *strRatio3Str = [strRatio3Array componentsJoinedByString:@","];
    
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"userId"] = [NSString stringWithString:[XHHAccountTool account].userid];
    params[@"strId"] = strId;  // 原料id串
    params[@"strRatio"] = strRatioStr; // 原料小猪的比例串
    params[@"strRatio2"] = strRatio2Str; // 原料中猪的比例串
    params[@"strRatio3"] = strRatio3Str; //  原料大猪的比例串
    params[@"typePig"] = self.pigType; // 猪的类型 母猪2 育肥猪3
    if ([self.pigType isEqualToString:@"3"]) {
        params[@"formulaId"] = [[NSUserDefaults standardUserDefaults] objectForKey:@"aFormulaId"]; // 育肥猪配方 id
    } else if ([self.pigType isEqualToString:@"2"]) {
        params[@"formulaId"] = [[NSUserDefaults standardUserDefaults] objectForKey:@"bFormulaId"]; // 母猪配方 id
    }

Step6. 当上传数据成功,刷新展现数据,请求列表数据展现处理

数据展现时在当前控制器里使用接口返回的比例值(ratio)

if ([json[@"success"] isEqual:@(YES)]) {
            
  [self.list removeAllObjects];
    if ([json[@"data"][@"userFormulaList"] count]) {
                
       NSArray *currentPageArray = [XHHUserFormulaModel loadUserFormulaInfoFromJson:json[@"data"][@"userFormulaList"]];
       [weakSelf.list addObjectsFromArray:currentPageArray];
                
       // 原料的比例总计和
         self.total1 = 0;
         self.total2 = 0;
         self.total3 = 0;
         for (XHHUserFormulaModel *model in currentPageArray) { // 遍历模型中比例值
             self.total1 = self.total1 + [model.ratio integerValue]; // 
             self.total2 = self.total2 + [model.ratio2 integerValue];
             self.total3 = self.total3 + [model.ratio3 integerValue];
          }
      }
  }

上面是以小猪比例值做计算, 同理, 中猪大猪一样去解决就好,升级属性strRatio2和strRatio3!

Step7. 切记Cell 里 model 赋值一定要判断是否文本输入框值

当下拉获取多条数据时, 数据源还是之前请求回来的 model, 就会出现数据展现错误.
就是回显model赋值了,但是cell里面的model还是数据请求回来的model 值ratio而不是文本输入框值strRatio!

所以在Cell 里赋值一定要加判断逻辑:当文本输入的应该回显文本输入值而不是上次数据源数据.

// model赋值
- (void)setModel:(XHHUserFormulaModel *)model {
    
    _model = model;

    // 当文本输入的应该回显文本输入值
    self.pig1.text = [NSString stringWithFormat:@"%@%%", (model.strRatio.length > 0) ? model.strRatio : model.ratio];
    self.pig2.text = [NSString stringWithFormat:@"%@%%", (model.strRatio2.length > 0) ? model.strRatio2 : model.ratio2];
    self.pig3.text = [NSString stringWithFormat:@"%@%%", (model.strRatio3.length > 0) ? model.strRatio3 : model.ratio3];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容