我正在尝试制作一个读写.plist文件的可可应用程序。 我可以从.plist中检索信息,写入,但是当一个键(仅限字符串)为空时,应用程序不会写入plist。
这里有一个示例:
-
(IBAction)saveBoot:(id)sender {
NSString *errorDesc;
NSString *bootPath = @"/myplist.plist";
NSMutableDictionary *plistBootDict =
[NSMutableDictionary dictionaryWithObjects:
[NSMutableArray arrayWithObjects:
Rescan,
RescanPrompt,
GUI,
InstantMenu,
DefaultPartition,
EHCIacquire,
nil]
forKeys:[NSMutableArray arrayWithObjects:
@"Rescan",
@"Rescan Prompt",
@"GUI",
@"Instant Menu",
@"Default Partition",
@"EHCIacquire",
nil]];
NSData *plistBootData = [NSPropertyListSerialization
dataFromPropertyList:plistBootDict
format:NSPropertyListXMLFormat_v1_0
errorDescription:&errorDesc];
if (bootPath) {
[plistBootData writeToFile:bootPath atomically:NO];
}
else {
NSLog(errorDesc);
[errorDesc release];
}
}
@end
我想我需要一个循环来检查每个键是否为空(如果为空则将其删除), 但我尝试了不同的(objectEnumerator,objectForKey:..等)方法whitout成功。
如果有人可以像我一样帮助初学者, 提前谢谢。
罗南。
答案 0 :(得分:0)
问题可能是因为nil
是变量参数列表的终止符,所以如果RescanPrompt
是nil
,则对象数组将只包含该部分(所以你不能“删除如果空”,因为它首先不存在于字典中)。你应该一块一块地构建你的字典;类似的东西:
NSMutableDictionary *plistBootDict = [NSMutableDictionary dictionary];
if (Rescan)
[plistBootDisc setObject:Rescan forKey:@"Rescan"];
if (GUI)
[plistBootDisc setObject:GUI forKey:@"GUI"];
// etc
(另外,如果您以后永远不会改变它们,则没有理由使用NSMutableArray
或NSMutableDictionary
。)