在我的应用程序中,我实现了几个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
值。
答案 0 :(得分:0)
看看从plist加载你的值。
您需要在项目中创建一个新的plist文件并将其属性添加到它(看起来有点像JSON编辑器 - 相当容易理解)
在代码中,您可以使用以下代码行将plist加载到内存中:
NSString *pathToMyPlist = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"];
NSDictionary *myPlistContents = [[NSDictionary alloc] initWithContentsOfFile:pathToMyPlist];
然后,您有一个NSDictionary
,其中包含您在plist中指定的键和值。您可以遍历这些键和值来初始化对象。
答案 1 :(得分:0)
如果我正确理解你的问题,在处理具有不同结构的数组时,我总是这样做。
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:
然后你必须输入原型的任何新参数:
+ (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;
这将使您不必更新所有代码。此外,这将告诉您每个函数将返回哪些数据类型超级有用。更新索引号。节省时间,因为它全部在一个地方完成。
我希望这是你的问题所指的:)