【问题标题】:Storing an NSMutableArray of NSObjects into NSUserDefaults将 NSObjects 的 NSMutableArray 存储到 NSUserDefaults
【发布时间】:2013-03-20 05:10:01
【问题描述】:

我目前正在为 iPhone 编写一个应用程序,我需要遵循的设计要求之一如下:

NSObjects 存储到NSMutableArray,将数据显示到UITableView 并将数据保存到NSUserDefaults。我可以将NSObject 存储到NSMutableArray 中并将其显示在UITableView 中,但我需要帮助了解如何将数据存储在NSObjectNSUserDefaults 中。

我对@9​​87654330@的定义:

    #import <Foundation/Foundation.h>
    @interface Name : NSObject
    @property (nonatomic)NSString *name;
    @property (nonatomic)NSInteger score;
    @end

我对@9​​87654332@的实现

    #import "Name.h"
    @implementation Name
    -(id)initWithName:(NSString*)name andScore:(NSInteger)score
    {
    _name = name;
    _score= score;
    return [super init];
    }
    @end

这就是我存储到我的NSObject的方式:

    NSString *newName = _submitNameTextBox.text;
    NSInteger score = 0;
    Name *name = [[Name alloc] init];//Name is the object name
    name.name = newName; 
    name.score = score;
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSMutableArray *listTemp = appDelegate.nameList; //main copy of my list is in app delegate, but i have it accessible by my uiviewcontrollers.

我在secondUIViewController 中添加NSObjects,并在我的第三个UIViewController 中显示数据,而我的第一个是存储数据的基本操作屏幕。

所以我的问题是,考虑到我用来定义NSObject 的代码以及我如何将所述对象存储到NSMutableArray,我如何在应用程序关闭时将NSMutableArray 存储到NSUserDefaults。想法是数组需要使用上次运行的数据加载程序数组,以便用户可以跟踪他/她的数据。

【问题讨论】:

  • [[NSUserDefaults standardUserDefaults] setObject:self.arrayOfPDF forKey:@""]; [ [NSUserDefaults standardUserDefaults] 同步];
  • 您不能在NSUserDefaults 中存储自定义对象。您需要先将它们编码为NSData
  • 那个 Init 方法可能不会像你想象的那样做

标签: ios objective-c xcode nsmutablearray nsuserdefaults


【解决方案1】:

如果您需要编写包含字符串的数组,那么:

保存:

[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"ArrayKey"];

阅读:

NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"ArrayKey"]];

由于您需要编写包含对象的 Array,因此您需要对它们进行编码并使用 Archiver。

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:array forKey:@"array"];
}

- (id)initWithCoder:(NSCoder *)coder {
    array=[coder decodeObjectForKey:@"array"];
    return self;
}


- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
{
    return nil;
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    yourObject=[NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"array is ->%@",[yourObject array]);
    return YES;
}

【讨论】:

    【解决方案2】:

    您需要在应用终止时使用您的 App Delegate 的 applicationDidEnterBackground 事件存储该数组。

    - (void)applicationDidEnterBackground:(UIApplication *)application 
    {
       [[NSUserDefaults standardUserDefaults] setObject:nameList forKey:@"dataArray"];
    }
    

    当您的应用再次加载时,您需要使用您的应用代理的didFinishLaunchingWithOptions 代理加载数据。

    -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
       nameList = (NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"dataArray"];
       if(!nameList)
       {
           //First time load or data is not saved yet
       }
    }
    

    【讨论】:

    • applicationWillTerminate 不会被大多数应用程序调用。进入后台保存会是更好的选择。
    • @H2CO3:我刚刚回答了 OP 关于“如何在应用程序关闭时将 NSMutableArray 存储到 NSUserDefaults 的查询。想法是数组需要使用上次运行的数据加载程序数组,所以用户可以跟踪他/她的数据。"
    • @MidhunMP 抱歉花了一段时间,但我无法使用 Mac 进行开发。我尝试了上面的代码,它似乎不起作用。我不知道它是不是保存权还是加载权。
    【解决方案3】:

    这个概念很简单。您正在创建类名称的对象,并在 UITableView 中显示它。当您创建一个对象并在 UiTableView 中显示它时,您使用的是内存地址,您只需从 NSMutableArray 获取活动对象,而您试图将对象保存在 NSUserDefaults 中,然后重新运行应用程序您什么也得不到,因为引用将被杀死,因此请保存放在您的类对象通知中的数据,字符串或字典..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多