iOS存储对象数组

时间:2015-07-10 15:50:53

标签: ios uitableview nsuserdefaults nsobject

在我的应用程序中,我实现了几个tableview控制器,为每个单元格显示一个NSObject。每个tableviewcontroller都有一个不同的"过滤器"应用于数组,以便每个表显示这些对象的特定组。 在每个tableviewcontroller的viewdidload中,我从NSUserdefaults加载我的数组,过滤它并显示它。这很好用,我使用NSCoder来获取编码/解码的对象进行存储。 仅出于开发目的,我以编程方式创建每个Object(initWithName:(NSString *)名称等),将所有对象添加到数组并存储它。 但我相信这不是最终的解决方案。 题: 我正在寻找一种方法来实现这个对象数组,而无需在代码中手动创建每个对象。对象的数量是固定的,其内容不能改变。他们只需要加载。添加:可能在将来的更新中,我会将新项目添加到列表中。 我该怎么办?

所以我像@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中,所以它是不可编辑的...... 是否可以从一开始就将.plist存储在文档目录中(可能是在xcode中)? 这是我的.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>

因此,当用户按下特定按钮时,我想更改此项目的.plist文件中的isFavorite值。

2 个答案:

答案 0 :(得分:0)

看看从plist加载你的值。

您需要在项目中创建一个新的plist文件并将其属性添加到它(看起来有点像JSON编辑器 - 相当容易理解)

在代码中,您可以使用以下代码行将plist加载到内存中:

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

NSDictionary *myPlistContents = [[NSDictionary alloc] initWithContentsOfFile:pathToMyPlist];

然后,您有一个NSDictionary,其中包含您在plist中指定的键和值。您可以遍历这些键和值来初始化对象。

答案 1 :(得分:0)

如果我正确理解你的问题,在处理具有不同结构的数组时,我总是这样做。

在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:

时,您会使用这些变量

更新arrayNEW原型和函数定义

然后你必须输入原型的任何新参数:

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

您必须在使用此功能的代码中进行更新,因为您将获得类似的 undefinded function 。然后还将参数列表中的变量添加到实现文件中的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;

这将使您不必更新所有代码。此外,这将告诉您每个函数将返回哪些数据类型超级有用。更新索引号。节省时间,因为它全部在一个地方完成。

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