gestureRecognizer
개의 개체가있는 사용자 지정 개체 인 UIImageView
하위 클래스가 있습니다.iOS에서 맞춤 개체를 저장/직렬화하는 올바른 방법
NSMutableArray
에 저장된 이러한 개체가 여러 개있는 경우 사용자가 앱을 다시 실행할 때로드 될 수 있도록이 개체 배열을 디스크에 저장하는 방법은 무엇입니까?
디스크에서 배열을로드하고 개체를 사용하고 싶습니다.
gestureRecognizer
개의 개체가있는 사용자 지정 개체 인 UIImageView
하위 클래스가 있습니다.iOS에서 맞춤 개체를 저장/직렬화하는 올바른 방법
NSMutableArray
에 저장된 이러한 개체가 여러 개있는 경우 사용자가 앱을 다시 실행할 때로드 될 수 있도록이 개체 배열을 디스크에 저장하는 방법은 무엇입니까?
디스크에서 배열을로드하고 개체를 사용하고 싶습니다.
비슷한에 대한 나의 구현은 다음과 완벽하게 작동입니다 :
사용자 정의 개체 (설정) 프로토콜을 구현해야합니다 NSCoding :
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.difficulty forKey:@"difficulty"];
[encoder encodeObject:self.language forKey:@"language"];
[encoder encodeObject:self.category forKey:@"category"];
[encoder encodeObject:self.playerType forKey:@"playerType"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.difficulty = [decoder decodeObjectForKey:@"difficulty"];
self.language = [decoder decodeObjectForKey:@"language"];
self.category = [decoder decodeObjectForKey:@"category"];
self.playerType = [decoder decodeObjectForKey:@"playerType"];
}
return self;
}
다음 코드는 파일에 사용자 지정 개체를 기록 (set.txt) 다음 배열에서 myArray으로 복원 :
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"set.txt"];
NSMutableArray *myObject=[NSMutableArray array];
[myObject addObject:self.settings];
[NSKeyedArchiver archiveRootObject:myObject toFile:appFile];
NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:appFile];
이 블로그 게시물 NSKeyedArchiver를 사용하여 디스크에 사용자 정의 객체의 배열을 저장하고 NSKeyedUnarchiver 그것을 다시 읽는 방법을 설명합니다
http://www.cocoabuilder.com/archive/cocoa/240775-saving-nsarray-of-custom-objects.html
애플은 또한이 문제에 매우 유용한 가이드를 가지고는 Archives and Serializations Programming Guide.
//store the array
[NSKeyedArchiver archiveRootObject:myArray toFile:@"someFile"];
//load the array
NSMutableArray* myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:@"someFile"];
배열에 사용자 정의 객체 유형이 포함되어있는 경우이 유형이 NSCoding Protocol을 준수하는지 확인해야 작동합니다.
감사합니다. 그래서 배열에 상관없이 저장 될 때 배열을 반환해야합니다? 배열 항목을 검색하고 사용할 수 있습니까? – jarryd
내가 잘못하고있을 수도 있지만이 간단한 코드는 사용자 지정 개체에 대해 작동하지 않는다고 생각합니다. 두 메서드 모두 'No'를 반환합니다. – Deco
@Deco - 사용자 지정 개체 유형은 [NSCoding Protocol] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/Reference/Reference.html)에서 확인해야합니다. 이게 작동합니다. – aroth
someb 만약 내가, 코스타스 솔루션 내 개선 사항을 공유하고 싶습니다 ody는 그들을 필요로합니다.
- (void)viewDidLoad
{
[super viewDidLoad];
// Restoring form object from the file
NSString *formFilePath = [self formFilePath];
RRCreateResumeForm *form = [NSKeyedUnarchiver unarchiveObjectWithFile:formFilePath];
if (form != nil) {
self.formController.form = form;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Saving the form object to the file
NSString *formFilePath = [self formFilePath];
[NSKeyedArchiver archiveRootObject:self.formController.form toFile:formFilePath];
}
// Returns a file path to the file with stored form data for form controller
- (NSString *)formFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *formClassName = NSStringFromClass([self.formController.form class]);
NSString *formFileName = [NSString stringWithFormat:@"%@.txt", formClassName];
NSString *formFilePath = [documentsDirectory stringByAppendingPathComponent:formFileName];
return formFilePath;
}
이것은 더 많은 표를 가져야합니다. 완벽한 솔루션과 정말 나를 도왔습니다. 감사! – ChrisC
FYI : 커스텀 객체가'NSCoding'을 따르고'initWithCoder :'와'encodeWithCoder :'를 구현하는 한, 이것을 보관시 루트 객체로 사용할 수 있습니다. 이 코드에서와 같이 NSMutableArray에 넣을 필요가 없습니다. –
FYI : NSKeyedArchiver 및 NSCoding의 방법과시기, 이유에 대한 자세한 정보가 필요하면 http://nshipster.com/nscoding/에서 살펴보십시오. – haxpor