NSUserDefaults 不起作用

Posted

技术标签:

【中文标题】NSUserDefaults 不起作用【英文标题】:NSUserDefaults doesn't work 【发布时间】:2013-09-08 09:41:55 【问题描述】:

我是编程新手,但遇到一个问题。我创建应用程序,有两个视图。第一个是 tableviewcontroller,第二个是视图控制器。从第二个视图,我通过 perepareForSegue 方法将数据发送到我的 tableview 中。我的数据(字符串)是 NSMutableArray,我想在 appDelegate.m 中的应用 didEnterBackgoung 之后将这个 MutableArray 保存到 UsedDefault 然后我想把它加载回来,但什么也没发生。我将我的代码放在 appDelegate.m 中的 appDidBecomeActive 中,并且我已经尝试在我的第一个视图 viewDidLoad 中编写它,但没有任何操作。在新的应用程序启动后,我的 MuttableArray 仍然是空的。

这是我的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application

NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.flipsideView.zoznamFunkcii forKey:@"NSMutableArray"];
[defaults synchronize];

flipsideView 是我的第一个视图,zoznamFunkcii 是我的 NSMuttable 数组

这是我的加载方法:

- (void)applicationDidBecomeActive:(UIApplication *)application

NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
self.flipsideView.zoznamFunkcii = [NSMutableArray arrayWithArray:[defaults  objectForKey:@"NSMutableArray"]];

谁能帮我解决这个问题?我不知道为什么它不起作用。

【问题讨论】:

【参考方案1】:

您将一个空的 NSMutableArray 保存到 NSUserDefaults。所以当然加载的数组也将是空的。

这是您使用 cmets 保存的代码:

// overwrite zoznamFunkcii with empty array
self.flipsideView.zoznamFunkcii = [[NSMutableArray alloc]init];

NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];

// save this empty array to nsuserdefaults
[defaults setObject:self.flipsideView.zoznamFunkcii forKey:@"NSMutableArray"];

您的保存代码应该如下所示:

- (void)applicationDidEnterBackground:(UIApplication *)application

    NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:self.flipsideView.zoznamFunkcii forKey:@"NSMutableArray"];

并且由于 NSUserDefault 不保存可变对象,因此您的恢复代码应如下所示:

- (void)applicationDidBecomeActive:(UIApplication *)application

    NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
    self.flipsideView.zoznamFunkcii = [NSMutableArray arrayWithArray:[defaults objectForKey:@"NSMutableArray"]];


如果数组中的对象不是 NSDataNSStringNSNumberNSDateNSArrayNSDictionary 的实例,则必须先对数组进行编码。有关如何执行此操作的详细信息,请参阅this question。

【讨论】:

我已经更改了该代码,但仍然无法正常工作。当我启动我的应用程序时,有 0 个对象。不知道怎么回事。 看来我必须将 NSMutableArray 字符串编码为 NSData 并保存它们。 50 人看到了这个问题,只有一个人写了一些帮助?【参考方案2】:
Here you can Save Object With NSUserDefault..

[[NSUserDefaults standardUserDefaults]setObject:[NSKeyedArchiver archivedDataWithRootObject:self.flipsideView.zoznamFunkcii] forKey:@"NSMutableArray"];
    [[NSUserDefaults standardUserDefaults]synchronize];

and you make coder and decoder method

- (id)initWithCoder:(NSCoder *)decoder 
    if (self = [super init]) 
        self.toolResult = [decoder decodeObjectForKey:@"obj1"];
        self.toolNotes = [decoder decodeObjectForKey:@"obj2"];

     
    return self;


- (void)encodeWithCoder:(NSCoder *)encoder 
    [encoder encodeObject:self.toolResult forKey:@"obj1"];
    [encoder encodeObject:self.toolNotes forKey:@"obj2"];



your Data Save Into NsuserDefault When you Get Data From NsUserDefault then you Use like
[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"NSMutableArray"]];

【讨论】:

以上是关于NSUserDefaults 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

NSUser Defaults 保存按钮状态并再次显示

iOS 10,NSUserDefaults 不起作用

NSUserDefaults 不起作用

使用 NSUserDefaults 保存 NSMutableArray 不起作用

为啥 NSUserDefaults 在我的应用程序和共享扩展程序之间不起作用?

在 watchOS 2 中读取 NSUserDefaults(我知道 App Groups 不起作用)