gpt4 book ai didi

iphone - 将项目添加到 NSMutableArray 并保存/加载

转载 作者:行者123 更新时间:2023-12-03 20:22:20 25 4
gpt4 key购买 nike

我用过this创建具有使用 NSMutableArray 填充的 TableView 的应用程序的教程。现在我想添加功能以将其他项目添加到数组并保存/加载它们。我已将 Fruit 类自定义为如下所示:

#import <UIKit/UIKit.h>

@interface Fruit : NSObject {
NSString *name;
NSString *instructions;
NSString *explination;
NSString *imagePath;
}

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *instructions;
@property(nonatomic,copy) NSString *explination;
@property(nonatomic,copy) NSString *imagePath;

- (id)initWithName:(NSString*)n instructions:(NSString *)inst explination:(NSString *)why imagePath:(NSString *)img;

@end

和 Fruit.m 文件:

#import "Fruit.h"

@implementation Fruit
@synthesize name,instructions,explination,imagePath;

- (id)initWithName: (NSString*)n instructions:(NSString*)inst explination:(NSString *)why imagePath:(NSString *)img {
self.name = n;
self.instructions = inst;
self.explination = why;
self.imagePath = img;
return self;
}
@end

这很好用,我可以加载两个 TextView 和一个 ImageView ,而不仅仅是一个 TextView 。但是,我将如何保存用户创建的任何新项目,并在应用程序再次启动时加载它们(如果存在)?

最佳答案

要将阵列保存到磁盘,您需要做一些事情。

首先,您需要向水果类添加一些方法,使其符合 NSCoding协议(protocol)。

第一个方法是- (id)initWithCoder:(NSCoder *)aDecoder。当您从保存的存档创建 Fruit 对象时,将调用此方法。
第二种方法是 - (void)encodeWithCoder:(NSCoder *)aCoder。此方法用于将您的水果保存在存档中。

听起来很复杂?事实上并非如此。只需几行易于理解的代码。

- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.instructions = [aDecoder decodeObjectForKey:@"instructions"];
self.explanation = [aDecoder decodeObjectForKey:@"explanation"];
self.imagePath = [aDecoder decodeObjectForKey:@"imagePath"];
}
return self;
}

看看这个 init 方法的前两行。您必须调用 [super init] 并检查 initWithName:instructions:explination:imagePath: 方法中的 self 是否不为 nil 。在这种特殊情况下它不会改变任何东西,但是在您接下来编写的几个类中这肯定会改变。所以一直使用它。
我为你改变了这个。我更改了拼写错误。

- (id)initWithName: (NSString*)n instructions:(NSString*)inst explination:(NSString *)why imagePath:(NSString *)img {
self = [super init];
if (self) {
self.name = n;
self.instructions = inst;
self.explanation = why;
self.imagePath = img;
}
return self;
}

以及编码方法:

- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:name forKey:@"name"];
[aCoder encodeObject:instructions forKey:@"instructions"];
[aCoder encodeObject:explanation forKey:@"explanation"];
[aCoder encodeObject:imagePath forKey:@"imagePath"];
}

键名不必与变量名匹配。你不需要这样做。但在我看来,它增加了一些清晰度。只要您使用与编码相同的名称进行解码,您就可以使用任何您想要的名称。

<小时/>

第一部分已经完成。接下来,您需要加载 NSMutableArray 并将其保存到文件中。但要做到这一点,您需要文档目录的路径。因此,我创建了一个进入 Controller 的小辅助方法。

- (NSString *)applicationDocumentsPath {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

然后我们需要从磁盘加载数组。

NSString *path = [[self applicationDocumentsPath] stringByAppendingPathComponent:@"some.fruits"];

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if (!array) {
// if it couldn't be loaded from disk create a new one
array = [NSMutableArray array];
}

然后你可以添加任意数量的水果,最后,要将数组保存到磁盘,你需要这一行。

BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:path];

如果存档完成且没有错误,您可以检查结果。

<小时/>

我想这应该能让你开始。快乐编码。

关于iphone - 将项目添加到 NSMutableArray 并保存/加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5361134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com