Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在数组中保存自定义对象并将其存储在NSUserDefaults-iPhone中_Ios_Objective C_Arrays_Nsuserdefaults - Fatal编程技术网

Ios 如何在数组中保存自定义对象并将其存储在NSUserDefaults-iPhone中

Ios 如何在数组中保存自定义对象并将其存储在NSUserDefaults-iPhone中,ios,objective-c,arrays,nsuserdefaults,Ios,Objective C,Arrays,Nsuserdefaults,我在按钮操作方法之后获得自定义类对象。现在我需要将多个自定义对象存储在NSMutableArray中,然后将此数组存储在NSUserDefaults中 这是我的密码: -(IBAction)onClickSubmitLater:(id)sender { //Saving store in user defaults for later upload data. NSMutableArray *arrayStoreList = [[NSMutableArray alloc] in

我在按钮操作方法之后获得自定义类对象。现在我需要将多个自定义对象存储在
NSMutableArray
中,然后将此数组存储在
NSUserDefaults

这是我的密码:

-(IBAction)onClickSubmitLater:(id)sender
{
    //Saving store in user defaults for later upload data.

    NSMutableArray *arrayStoreList = [[NSMutableArray alloc] init];
    arrayStoreList = [Util getArrayPreference:@"Store"];//arrayStoreList is the list of all stores.

    Store *store = [[Store alloc] init];
    store = [arrayStoreList objectAtIndex:self.selectedStoreIndex];//here i am getting particular store that i need to save in array.

    //archive
    NSData *dataStore = [NSKeyedArchiver archivedDataWithRootObject:store];
    [[NSUserDefaults standardUserDefaults] setObject:dataStore forKey:@"resultStore"];

    //unarchive
    NSData *dataResultStore = [[NSUserDefaults standardUserDefaults] objectForKey:@"resultStore"];

    Store *resultStore = (Store *)[NSKeyedUnarchiver unarchiveObjectWithData:dataResultStore];
    NSLog(@"%@", resultStore);
}
使用上述代码,它将单个自定义类
存储
对象保存在
NSUserDefaults
中。因此,我希望在提交以后的iAction后,将所有
存储
对象保存在
NSMutableArray
中。稍后,我将获取存储阵列,以便在服务器上逐个上载存储


谢谢。

这两种方法主要用于
存储
检索
自定义对象的属性

- (void)encodeWithCoder:(NSCoder *)encoder ;
- (id)initWithCoder:(NSCoder *)decoder;

看看@chrissr's、@Brad Larson's

您需要通过实现
NSCoding
协议对其进行归档。然后您可以将其写入任何文件

在模型中实现以下方法:

- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;
正如您所说,您已经在类中实现了这一点,现在需要保存数组

要保存和读取数组,需要使用:

[[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:@"keyForArray"];
NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"keyForArray"]];

要使用用户默认值存储和检索具有自定义对象的数组,可以使用以下方法:

-(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];
    [defaults setObject:data forKey:keyName];
    [defaults synchronize];
}

-(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:keyName];
    NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    [defaults synchronize];
    return myArray; 
}
但是要确保你已经实现了

- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;
数据模型类中避免崩溃的方法,如下所示:

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

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [super init];
    if (self != nil)
    {
        label = [[coder decodeObjectForKey:@"label"] retain];
        numberID = [[coder decodeIntegerForKey:@"numberID"] retain];
    }   
    return self;
}

谢谢mani,我已经在store entity类中实现了上述NSCoding方法。如果这些注释对您有所帮助,请为访客的注意打勾或投票正确@mani,但我的问题是将所有存储对象保存在NSMutableArray中。使用上面的代码,我在Userdefaults中保存了一个类对象。像这样,首先我需要将所有存储添加到一个数组中,然后将该数组存储在userdefault中。你看到@Brad Larson的答案了吗?我添加了链接?老兄,你说你使用了他的代码来实现上述方法,你必须表示尊重并放弃投票权。+1然后是什么问题?谢谢你。这里使用我上面的代码,我只存储Userdefaults中的一个存储对象“resultStore”。但我需要在这里创建一个数组,然后在其中存储所有的存储对象。所以你的问题是处理数组?检查我编辑的回答它正在显示[NSUserDefaults setObject:forKey:]:尝试在控制台中插入类“\uu NSArrayM”的非属性值“(”)。-(void)encodeWithCoder:(NSCoder*)encode;-(id)initWithCoder:(NSCoder*)解码;我已经实现了店内实体。为什么使用downvote?NSUserDefaults用于存储首选项,因此请向自己提出以下问题:“是否有必要使用NSUserDefaults”?还有许多其他的选项来持久化数据,比如存储为plist、使用编码器和解码器等。有一个由nick lockwood编写的漂亮的可重用类,请看。我建议你用它。谢谢是的,根据我的要求,我必须使用userDefaults。从Xcode停止应用程序后。它将保持不变。感谢您的帮助,也感谢您避免崩溃。@AbdullahMd.Zubair我必须在代码中的任何地方使用
encodeWithCoder
initWithCoder
吗?您必须实现,否则将无法工作!但是你没有在任何地方使用!事实上,我没有得到这个,你必须为你的模型实现它