誰かがまだその解決策を必要としているかどうかはわかりませんが、これを機能させるための良い方法を見つけました.
UIDocument はデータを NSData または NSFilewrapper としてのみ受け入れるため、最初に NSData から NSDictionary を返す NSDictionary クラスのカテゴリを作成しました。カテゴリの 2 つのファイルを次に示します。
NSDictionary+DictFromData.h:
#import <Foundation/Foundation.h>
@interface NSDictionary (DictFromData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end
および NSDictionary+DictFromData.m
#import "NSDictionary+DictFromData.h"
@implementation NSDictionary (DictFromData)
+ (id)dictionaryWithData:(NSData *)data {
return [[[NSDictionary alloc] initWithData:data] autorelease];
}
- (id)initWithData:(NSData *)data {
NSString *tmp = nil;
self = (NSDictionary *)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:&tmp];
NSAssert1(tmp == nil,@"Error in plist: %@",tmp);
return [self retain];
}
@end
(ソース)
このカテゴリを UIDocument サブクラスにインポートすると、Plist ファイルを iCloud コンテナに簡単に読み込んで保存できます。
Plist を iCloud からロードするには、これを UIDocument サブクラスに追加します (プロパティの内容は NSDictionary です)。
- (BOOL)loadFromContents:(id)contents
ofType:(NSString *)
typeName error:(NSError **)outError {
if ([contents length] > 0){
self.contents = [NSDictionary dictionaryWithData:contents];
} else {
self.contents = nil;
}
// call some Methods to handle the incoming NSDictionary
// maybe overwrite the old Plist file with the new NSDictionary
return YES;
}
データをiCloudに保存するには、これを追加します:
- (id)contentsForType:(NSString *)typeName error:(NSError **)outError {
NSData * plistData = [[[NSData alloc]initWithContentsOfFile:YOUR_PLIST_FILE]autorelease];
return plistData;
}
今電話すると:
[myUIDocument updateChangeCount:UIDocumentChangeDone];
YOUR_PLIST_FILE が同期されています。iCloud コンテナの更新には約 10 ~ 15 秒かかることに注意してください。