我知道这个问题看起来与许多以前提出的问题类似,但在阅读完所有问题和答案之后,我无法理解该怎么做。
我想写一些包含wordNames
和wordDefinitions
,以及一些ID
和date ID
的单词。我有以下代码,但我有两个关于使用不同数据类型的数组的字典的问题,以及为字典定义键的方法。
如果我制作的整个.plist文件错误,请纠正我。
提前致谢。
- (IBAction)addWord:(id)sender
{
NSString *destinationPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
destinationPath = [destinationPath stringByAppendingPathComponent:@"Box.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:destinationPath])
{
NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Box" ofType:@"plist"];
[fileManager copyItemAtPath:sourcePath toPath:destinationPath error:nil];
}
// Load the Property List.
NSMutableArray* wordsInTheBox = [[NSMutableArray alloc] initWithContentsOfFile:destinationPath];
NSString *wordName = word.name;
NSString *wordDefinition = word.definition;
NSInteger deckID;
NSDate addedDate;
//is this correct to have an array of different types?
NSArray *values = [[NSArray alloc] initWithObjects:wordName, wordDefinition, deckID, addedDate, nil];
//How and where am I supposed to define these keys?
NSArray *keys = [[NSArray alloc] initWithObjects: NAME_KEY, DEFINITION_KEY, DECK_ID_KEY, DATE_KEY, nil];
NSDictionary *dict = [[NSDictionary alloc] initWithObjects:values forKeys:keys];
[wordsInTheBox addObject:dict];
[wordsInTheBox writeToFile:destinationPath atomically:YES];
}
答案 0 :(得分:3)
initWithContentsOfFile:
始终返回不可变数组。你应该这样:
NSMutableArray *wordsInTheBox = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithContentsOfFile:destinationPath]];
我不完全理解的是word
变量的定义。它是一个伊娃吗?
如果您使用的是最新版本的Xcode(4.4或4.5),我建议使用更简单的文字来创建字典。
NSDictionary *dict = @{NAME_KEY : wordName,
DEFINITION_KEY : wordDefinition,
DECK_ID_KEY : deckID,
DATE_KEY : addedDate};
但我也没有看到你的字典定义有问题。它应该工作。
您必须确保在某处定义NAME_KEY,DEFINITION_KEY等。所有大写字母通常仅用于预处理器宏,因此您可以执行以下操作:
#define NAME_KEY @"Name"
#define DEFINITION_KEY @"Definition"
您也可以直接在字典中使用字符串:
NSDictionary *dict = @{@"Name" : wordName,
@"Definition" : wordDefinition,
@"DeckID" : deckID,
@"Date" : addedDate};
但是使用宏也不是一个坏主意。