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将返回超级有用的 。 更新索引号码。 节省时间,因为它全部在一个地方完成。
我希望这是你的问题所指的:)