Я знаю, что уже поздно, но я потратил последние несколько часов, чтобы понять это сам. Итак, вот так:
В файлах nib / xib (а теперь и в раскадровках) вы можете «заморозить» свои представления в файле, создав интерфейс в Interface Builder. По сути, здесь он архивирует эти объекты и сохраняет их в файле. Разве не было бы замечательно, если бы пользователи могли делать это с представлениями в вашем приложении? Ну, они могут!
Справочник Apple по архивированию действительно помог. Я читаю это спереди назад.
Для каждого вашего подкласса UIView реализовать encodeWithCoder:
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
// Encode any objects you want to load later.
// For example: [aCoder encodeObject:colors forKey:@"colors"];
// Make sure they conform to the NSCoder protocol!
}
Просто примечание по этому поводу: некоторые объекты не соответствуют протоколу NSCoder. Например, я использую объекты UIGestureRecognizer в некоторых из моих подклассов UIView. Поскольку они не соответствуют протоколу, я просто воссоздаю их, когда представление разархивировано с initWithCoder:
. Поэтому убедитесь, что у вас есть способ извлечения объектов, которые вы не можете заархивировать!
В initWithCoder
:
- (void)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialize your view
// Restore any objects that you encoded
// For example: self.colors = [aDecoder decodeObjectForKey:@"colors"];
}
return self;
}
Для сохранения вида:
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
- (IBAction)tapSave:(id)sender {
NSString *directory = [self applicationDocumentsDirectory];
NSString *archivePath = [directory stringByAppendingPathComponent:@"<filename>.archive"];
BOOL result = [NSKeyedArchiver archiveRootObject:<your root view> toFile:archivePath];
}
Наконец, чтобы загрузить представление и его подпредставления:
- (IBAction)tapLoad:(id)sender {
NSString *directory = [self applicationDocumentsDirectory];
NSString *archivePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"<filename>.archive"];
unarchivedView = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
}
Надеюсь, это поможет!