0

私は辞書内に配置している NSData オブジェクトを持っています。次に、辞書をドキュメント ディレクトリに書き込みます。次に、すぐにファイルへの URL を uiactivityviewcontroller で使用できるようにして、メール アプリに添付できるようにします。

問題は、ユーザーがこのファイルをクリックしてアプリにインポートすると、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 オブジェクトが存在しない理由がわかりません - 何か考えはありますか? どんな助けでも大歓迎です!

4

1 に答える 1

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:]だからです。ドキュメントには、交互の値とキーの null で終わるリストをパラメーターとして取ることが記載されています。したがって、リスト内の値が nil になると、残りのパラメーターは無視されます。

于 2013-11-08T15:33:23.763 に答える