iOS中如何更新字典totalsum值并在CartdisplayView中显示
嘿,我来帮你一步步搞定这个需求!咱们拆解成几个关键步骤来实现,逻辑清晰又好维护:
第一步:从
no数组中提取目标数字123 你的no数组输出是["[123]"],首先得把包裹的方括号去掉,提取出里面的数字字符串。在CartresultViewModel里处理这个逻辑就行:
// 假设你的no数组是ViewModel里的属性:NSArray *no; if (no.count == 0) { // 处理数组为空的边界情况,避免崩溃 return; } NSString *rawSumStr = no.firstObject; // 去掉首尾的方括号 NSString *cleanedSumStr = [rawSumStr stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"[]"]]; // 如果需要转成数字类型(比如模型的totalsum是NSInteger),可以这么做: NSInteger totalSum = [cleanedSumStr integerValue];
第二步:更新数据源的
totalsum值 接下来要把提取到的值替换掉数据源里默认的0。这里分两种情况处理:
情况1:数据源返回的是字典数组
如果CartresultDataSource默认返回的是字典数组,那我们需要把数组转成可变的来修改:
// 假设CartresultDataSource有一个返回数据的方法或者属性,比如: NSArray *originalData = [_cartDataSource getDefaultData]; NSMutableArray *mutableData = [originalData mutableCopy]; NSMutableDictionary *firstItem = [mutableData.firstObject mutableCopy]; // 替换totalsum的值,用清理后的字符串或者转成的数字(看需求) firstItem[@"totalsum"] = cleanedSumStr; // 把修改后的字典放回数组 mutableData[0] = firstItem; // 最后把更新后的数组同步回数据源(如果数据源支持修改,或者ViewModel自己维护一份可变数据) _cartDataSource.data = mutableData;
情况2:数据源返回的是cartresultModel模型数组
如果用的是自定义模型,那直接修改模型的属性就行(前提是模型的totalsum有setter方法):
NSArray *originalModels = [_cartDataSource getDefaultModels]; // 转成可变数组方便修改(如果原数组是不可变的) NSMutableArray *mutableModels = [originalModels mutableCopy]; cartresultModel *targetModel = mutableModels.firstObject; // 给模型的totalsum赋值,类型要匹配(比如模型属性是NSString就传cleanedSumStr,是NSInteger就传totalSum) targetModel.totalsum = cleanedSumStr; // 同步回数据源 _cartDataSource.models = mutableModels;
第三步:让
CartdisplayView的totalresult标签更新显示 最后要把更新后的数据同步到视图上,这里推荐两种常用的方式:
方式1:用闭包(Block)实现回调
在CartresultViewModel里定义一个回调块,当数据更新时通知视图:
// 在CartresultViewModel的头文件里声明 @property (nonatomic, copy) void(^onTotalSumUpdated)(NSString *totalSum); // 当你修改完数据源后,调用这个回调 if (self.onTotalSumUpdated) { // 确保在主线程更新UI dispatch_async(dispatch_get_main_queue(), ^{ self.onTotalSumUpdated(cleanedSumStr); }); } // 在CartdisplayView绑定ViewModel的时候,设置回调 self.viewModel.onTotalSumUpdated = ^(NSString *totalSum) { self.totalresult.text = totalSum; };
方式2:用KVO监听数据变化
如果希望视图自动监听数据源的变化,可以用KVO:
// 在CartdisplayView的初始化或者绑定方法里,给ViewModel的数据源添加观察者 [self.viewModel.cartDataSource addObserver:self forKeyPath:@"data" options:NSKeyValueObservingOptionNew context:nil]; // 实现KVO的回调方法 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if ([keyPath isEqualToString:@"data"]) { // 获取更新后的模型或字典,提取totalsum cartresultModel *model = self.viewModel.cartDataSource.data.firstObject; self.totalresult.text = model.totalsum; } } // 记得在视图销毁时移除观察者,避免内存泄漏 - (void)dealloc { [self.viewModel.cartDataSource removeObserver:self forKeyPath:@"data"]; }
额外注意点
- 一定要处理
no数组为空的情况,避免数组越界崩溃 - 更新UI的代码必须放在主线程,否则可能出现UI不更新或者崩溃
- 如果模型的
totalsum是数字类型,要注意字符串转数字的正确性(比如处理非数字字符的情况)
内容的提问来源于stack exchange,提问作者abel
相关产品推荐
相关产品推荐

