或多或少大家都会遇到这样的困扰, 我们使用了 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];
}