NSUserDefaults - 我设置的默认值以某种方式被删除[关闭]
Posted
技术标签:
【中文标题】NSUserDefaults - 我设置的默认值以某种方式被删除[关闭]【英文标题】:NSUserDefaults - a default I set is getting deleted somehow [closed] 【发布时间】:2014-03-03 14:32:45 【问题描述】:我的应用出现问题 - 我正在使用 NSUserDefaults 为当前正在使用该应用的用户保存“个人资料”。
它需要一些信息“姓名、员工 ID、地址和基础学校” - 非常标准的东西。它可以很好地保存并保存信息。
baseSchool 是通过具有学校列表的 UIPickerView 选择的 - 它使用我的 MetaMiles 类中名为 schoolNameList 的方法来使用学校列表填充pickerview。
当用户尝试向应用“添加里程”以使用相同的学校列表填充这些 UIPickerViews 时,我在另一个视图中使用相同的方法。
所以流程是这样的:
用户启动应用并设置他们的个人资料(点击保存 - 一切都保存到 NSUserDefaults) - 您可以毫无问题地反复打开和保存个人资料。
用户点击“添加里程” - 添加里程页面显示学校的pickerview,然后他们添加他们的里程。
用户点击“更改配置文件” - 应用程序崩溃。
应用程序崩溃是因为在某些时候 - NSUserDefaults 忘记了在步骤 1 中设置的 baseSchool(当用户第一次设置配置文件时)。它似乎仅在用户单击“添加里程”并加载该视图中的选择器视图时才会发生。
所以我想知道它是否与该方法有关 - 或者我是否没有正确保存我的默认值? 也许我应该使用 coredata 并将用户配置文件信息保存到实体?
任何建议/反馈表示赞赏。
这是我的个人资料视图:
//Call method to get array of school names (reusable)
MetaMiles *model = [MetaMiles schoolNameList];
_schoolList = (NSArray *)model;
//****LOAD USER DATA IF AVAILABLE****//
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"profileSetup"]==0)
else
_fullName.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"fullName"];
_employeeID.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"employeeID"];
_homeAddress.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"homeAddress"];
//****//****THIS IS WHERE THE CRASH OCCURS BECAUSE IT DOES NOT REMEMBER DEFAULT AFTER THE ADD MILES VIEW HAS BEEN VIEWED****//****//
NSString *lastSelectedSchool =[[NSUserDefaults standardUserDefaults] objectForKey:@"baseSchool"];
//If the add miles view hasn't been loaded this works fine - otherwise it is null
NSLog(@"Last Selected School from defaults: %@",lastSelectedSchool);
NSUInteger currentIndex = [_schoolList indexOfObject:lastSelectedSchool];
//This doesn't work if it's null!
NSLog(@"Integer of school: %lu", (unsigned long)currentIndex);
[schoolPicker selectRow:currentIndex inComponent:0 animated:YES];
//****END LOAD USER DATA****//
这是我的 MetaMiles 类方法
+ (NSArray*)schoolNameList
NSArray *schoolList;
MetaMiles *school;
//Create fetched results controller of data
NSFetchedResultsController *fetchedSchoolController = [MetaMiles MR_fetchAllSortedBy:@"beg_school" ascending:YES withPredicate:nil groupBy:@"beg_school" delegate:nil];
[fetchedSchoolController.fetchRequest setReturnsDistinctResults:YES];
//Turn the controller into an array called - fetchedSchools
NSArray *fetchedSchools = [fetchedSchoolController fetchedObjects];
//Create a set of school names - mutable set (only 1 listing per school)
NSMutableSet *schoolNames = [[NSMutableSet alloc]init];
//place each school name into the Set
for (school in fetchedSchools)
[schoolNames addObject:school.beg_school];
//Take the set, turn it into an array (schoolList) and order it by school name
schoolList = [[schoolNames allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES]]];
return schoolList;
@end
【问题讨论】:
代码太多了。请尽量减少示例。否则没有人会检查代码。 是的,我们只需要查看与您的问题直接相关的代码。 已更新 - 有针对性的违规代码 @Hanny 现在您可能删除了相关代码。请尝试将发布的代码减少到与您的问题相关的部分。在这种情况下,我们不需要查看您的所有业务逻辑和数据获取。但是处理 NSUserDefaults 的部分当然是了解发生了什么所必需的。 Meda 看了原代码,马上就发现了问题。我已经接受了他的回答。 【参考方案1】:你放置了:
selectedSchool = [NSString stringWithFormat:@"%@",
[_schoolList objectAtIndex:row]];
在 -didSelectRow:
中,但您通过点击按钮 ((IBAction)saveProfileButton:(id)sender
) 保存配置文件。
这就是baseSchool
为空的原因。
NSUserDefault
以空值崩溃。
【讨论】:
它最初保存得很好。您可以单击“保存配置文件”,然后再次打开配置文件,它会按应有的方式预先选择所有内容。如果您转到“添加里程”,那么在问题发生时返回个人资料 - 这与它有关吗? @Hanny 是的,因为只有当您在选择器视图中选择mile row
时才分配值,如果在未选择所选学校时点击 saveProfile 怎么办?你有一些设计问题。
在 -didSelectRow: 方法中保存学校似乎已经纠正了问题。我明白你现在最初的意思了。万分感谢! :)以上是关于NSUserDefaults - 我设置的默认值以某种方式被删除[关闭]的主要内容,如果未能解决你的问题,请参考以下文章