在for循环中设置UserDefaults标记失效问题排查
问题分析与修复方案
你的代码中hide始终为YES的核心原因是循环中hide的赋值逻辑被反复覆盖:
当前逻辑是每遇到一个不是「CASE OF COUNT」的Rating,就将hide设为YES;只有遇到匹配的Rating时,才将hide设为NO。这会导致如果数组中既有匹配的Rating,又有不匹配的Rating,且最后一个元素是不匹配的,hide会被最后一次赋值为YES,覆盖之前找到匹配时设置的NO,完全违背了“检测是否存在,不存在则标记hide=YES”的需求。
修复后的代码
- (NSMutableArray *) removeCaseOfCount:(NSArray *) ratings { NSMutableArray *ratingsLocal = [[NSMutableArray alloc] init]; NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; // 初始默认:不存在「CASE OF COUNT」,hide设为YES BOOL hide = YES; // 可选:避免重复赋值enterdByuser,初始设为0 self.enterdByuser = 0; for (Rating *rating in ratings) { NSLog(@"rating names %@",rating.name); if ([[Audt sharedInspection] checkOD]) { if (![[rating.od uppercaseString] isEqualToString:ODCases]) { [ratingsLocal addObject:rating]; } else { self.currentAudit.countOfCasesRatingPresent = YES; int cCasesFromAnswer = [rating.ratingAnswerFromUI integerValue]; self.cCEnteredByTheUser = cCasesFromAnswer; [ratingsLocal addObject:rating]; } } else { if([rating.name compare:@"CASE OF COUNT" options:NSCaseInsensitiveSearch] == NSOrderedSame) { // 找到目标Rating,标记存在,hide设为NO hide = NO; self.ca.Present = YES; [ratingsLocal addObject:rating]; } else { // 非目标Rating,hide保持当前状态(不修改) if (self.enterdByuser == 0) { // 仅第一次遇到非目标时赋值,避免重复操作 self.enterdByuser = 1; } [ratingsLocal addObject:rating]; } } } [userDefaults setBool:hide forKey:@"cCountIsEmpty"]; // 可选:确保NSUserDefaults立即同步 [userDefaults synchronize]; return ratingsLocal; }
关键修改点
- 初始化逻辑调整:默认
hide=YES(假设不存在目标Rating),只有找到匹配项时才改为NO - 避免覆盖赋值:非目标Rating不再修改
hide的值,确保一旦找到匹配项,hide就保持为NO - 优化
enterdByuser赋值:仅第一次遇到非目标Rating时赋值,避免循环中重复操作(原逻辑也能工作,但更高效) - 添加NSUserDefaults同步:确保设置立即写入,避免数据延迟
内容的提问来源于stack exchange,提问作者e.T55
相关产品推荐
相关产品推荐

