iOS存储对象数组

在我的应用程序中,我实现了几个tableviewcontrollers,为每个单元显示一个NSObject。 每个tableviewcontroller都有不同的“filter”应用于数组,所以每个表都显示这些对象的特定组。 在每个tableviewcontroller的viewdidload我从NSUserdefaults加载我的数组,过滤它,并显示它。 这工作得很好,我正在使用NSCoder获取对象进行编码/解码存储。 仅用于开发目的,我编程创build每个对象(initWithName:(NSString *)名称等),将所有对象添加到数组并将其存储。 但我相信这不是最终的解决scheme。 问题:我正在寻找一种方法来实现这个对象的数组,而不用手工创build每个对象的代码。对象的数量是固定的,它们的内容不能改变。 他们只需要加载。 添加:也许在将来的更新中,我将添加新项目的列表。 我该怎么做?

所以我实现了@Luke史密斯说,它完美的作品! 谢谢!

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"]; NSArray *allElements = [[NSArray alloc] initWithContentsOfFile:plistPath]; for (NSDictionary *newObject in allElements){ Object *tempObject = [[Object alloc] init]; tempObject.Type = [newObject objectForKey:@"Type"]; tempObject.isFavorite = [newObject objectForKey:@"isFavorite"]; [Elements addObject:tempObject];//MutableArray storing all Elements } 

但是,当我做了一些头脑风暴,我得出结论,我需要编辑一些条目。 不幸的是,因为.plist是在MainBundle它不可编辑…是否有可能从一开始(可能在xcode)将.plist存储在文档目录? 这是我的.plist:

 <plist version="1.0"> <array> <dict> <key>isFavorite</key> <false/> <key>Name</key> <string>Obj1</string> </dict><dict> <key>isFavorite</key> <true/> <key>Name</key> <string>Obj2</string> </dict> </array> </plist> 

所以当用户按下一个特定的button,我想改变这个项目.plist文件中的isFavorite值。

看看从plist加载你的值。

您需要在您的项目中创build一个新的plist文件并添加属性(看起来有点像JSON编辑器 – 很容易理解)

在代码中,你可以使用下面这行代码将你的plist加载到内存中:

 NSString *pathToMyPlist = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"]; NSDictionary *myPlistContents = [[NSDictionary alloc] initWithContentsOfFile:pathToMyPlist]; 

然后你有一个NSDictionary包含你在plist中指定的键和值。 你可以循环这些键和值来初始化你的对象。

如果我正确理解你的问题,这是我总是处理不同结构的数组。

在NSArray或MSMutableArray上使用类别实现

头文件

 static const int DIARIES_title = 0; @interface NSArray (DIARIES_) + (id)arrayNEWDiary; + (id)arrayNEWDiaryWithTitle:(NSString *)stringTitleValue; - (NSString *)objectDiary_title; @end 

植入文件

 @implementation NSArray (DIARY_) + (id)arrayNEWDiary { return [NSArray arrayNEWDiaryWithTitle: @"Untitled"]; } + (id)arrayNEWDiaryWithTitle:(NSString *)stringTitleValue { return [NSArray arrayWithObjects: stringTitleValue, nil]; } - (NSString *)objectDiary_title { return [self objectAtIndex: DIARIES_title]; } @end 

这将使你不想记住所有这些索引像objectAtIndex: 0也添加一个新的项目这个数组结构是容易和快速的:

添加新项目

首先添加并更新存储索引值的int

 static const int DIARIES_id = 0; static const int DIARIES_title = 1; static const int DIARIES_dateCreated = 2; 

当使用- objectAtIndex:- replaceObjectAtIndex: withObject:时,您将使用这些variables- replaceObjectAtIndex: withObject:

更新arrayNEW原型和函数定义

那么你将不得不input任何新的参数到原型:

 + (id)arrayNEWDiaryWithId:(NSInteger)idValue title:(NSString *)stringTitleValue dateCreated:(NSDate *)dateCreatedValue; 

你将不得不在你的代码中使用这个函数的地方更新,因为你会得到一个类似的未find的函数 。 然后将参数列表中的variables添加到实现文件中的return语句中:

 + (id)arrayNEWDiary { return [NSArray arrayNEWDiaryWithId: 0 title: @"Untitled" dateCreated: [NSDate date]]; } + (id)arrayNEWDiaryWithId:(NSInteger)idValue title:(NSString *)stringTitleValue dateCreated:(NSDate *)dateCreatedValue { return [NSArray arrayWithObjects: idValue, stringTitleValue, dateCreated, nil]; } 

访问对象

最后,你必须添加函数来访问数组中的每个值:

 - (NSInteger)objectDiary_id; - (NSString *)objectDiary_title; - (NSDate *)objectDiary_dateCreated; 

这将使你不必更新你的代码。 此外,这将告诉你什么数据types每个function将返回超级有用的 。 更新索引号码。 节省时间,因为它全部在一个地方完成。

我希望这是你的问题所指的:)