我有一个NSData对象,我放在字典里面。然后我将字典写入文档目录。然后我立即将该文件的URL提供给uiactivityviewcontroller,以便在Mail应用程序中包含它以便附件。
问题是,当用户单击此文件以导入到应用程序时,除了NSData对象之外,字典中的所有内容都可用(还有其他NSString对象)!当我测试以查看应该保存NSData对象的相关键的对象内部时,它返回(null)..
以下是代码的相关部分(为了清楚起见,我简化了一些部分,但它基本上是相同的代码):
NSDictionary *dictionaryItems = @{@"stringobj": @"string",
@"dataobj": dataobject};
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSURL *dictUrl = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"myinfo.myappinfo"]]; //my app will open this file type
[dictionaryItems writeToURL:dictURL atomically:YES];
// I will include the dictURL in the activityitems array so it can be attached to the the email when the uiacitivityitemcontroller is presented
当应用程序打开时,我只是从文件中加载字典,并尝试从“dataobj”键中检索nsdata对象..但它返回null。
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if (url !=nil && [url isFileURL]) {
self.importedDictionary = [NSDictionary dictionaryWithContentsOfURL:url];
NSLog("%@",[self.importedDictionary objectForKey:@"dataobj"]); //returns null.. why?
}
}
我不确定为什么我放在字典中的NSData对象不存在 - 有什么想法吗?任何帮助表示赞赏!
答案 0 :(得分:0)
谢谢你在我的问题评论的帮助下解决了它。
问题在于,由于nil值,文件在某些情况下没有写入磁盘。
如果字典中有任何引用nil项的键,则字典将不会写入文件。通过检查我想要包含在字典中的每个对象是否为nil来解决了这个问题,如果它是nil,那么我会从字典中省略它以确保它写入文件。
例如
NSDictionary *dictionaryItems = {@"key1":nil,@"key2":@"string object"};
BOOL didItWrite = [dictionaryItems writeToURL:dictURL atomically:YES];
//didItWrite will return NO in this case since we have a nil object in the dictionary
NSDictionary *dictionaryItems = {@"key1":dataobj,@"key2":@"string object"};
BOOL didItWrite = [dictionaryItems writeToURL:dictURL atomically:YES];
//didItWrite will return YES here since there are no objects that evaluate to nil in the dictionary.
在问题评论中引用@GuyKogus:
发生这种情况的原因是你真的是[NSDictionary dictionaryWithObjectsAndKeys:]。您将在文档中找到它作为参数的交替值和键的以空值终止的列表。因此,当列表中的值为零时,它将忽略其余参数。