不知道是否有人仍然需要一個解決方案,但我發現一個很好的方式來得到這個工作。
由於UIDocument只接受數據作爲NSData或NSFilewrapper,我首先爲NSDictionary類創建了一個Category,它從NSData返回一個NSDictionary。下面是該類別的兩個文件:
的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
(source)
如果你現在進口這個類別在您的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秒才能更新。
您是否找到了答案?我正在做同樣的事情,我的應用聽起來和你的非常相似。如果你找到一個好的教程,請讓我知道。 – Jackson
我也試圖做到這一點。我一直在用NSString修改教程,但我無法讓第二個設備看到數據。 – zambono
同上。 +1到海報 – autodidakto