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 - 我设置的默认值以某种方式被删除[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 plist 文件中为 UIColor 设置默认的 NSUserDefaults 值?

设置默认值以使用反应形式进行选择

NSUserDefaults 没有正确保存

加载 DataTable 时使用默认列值以避免 Null

NSUserdefaults 使用 xcodebuild

您如何修改默认值以接受 Y 或 N 而不仅仅是 SQL 中的 Y