Как сохранить состояние с помощью CALayers? - PullRequest
1 голос
/ 21 июля 2009

У меня есть простое приложение для iphone, которое рисует блоки, используя подкласс CALayer, и пытаюсь найти лучший способ сохранить состояние или сохранить текущие созданные слои.

Я попытался использовать ответ Брэда Ларсона из этого предыдущего вопроса о хранении пользовательских объектов в NSUserDefaults, который работал для сохранения моего подкласса CALayer, но не в его базовом состоянии, как геометрия и цвет фона, там, но не сделал на повторный запуск.

Я сделал мои объявленные переменные экземпляра соответствующими протоколу NSCoding, но не знаю, как заставить свойства CALayer делать то же самое без повторного объявления всех его свойств. Или это не правильный / лучший подход вообще?

Вот код, который я использую для архивации массива слоев:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:viewController.view.layer.sublayers] forKey:@"savedArray"];

А вот код, который я использую для перезагрузки своих слоев в -viewDidLoad:

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];

NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];

if (dataRepresentingSavedArray != nil) {

    [self restoreStateWithData:dataRepresentingSavedArray];

И в -restoreStateWithData:

    NSArray *savedLayers = [NSKeyedUnarchiver unarchiveObjectWithData:data];

if (savedLayers != nil) {

    for(layer in savedLayers) {

        [self.view.layer addSublayer:layer];

    }

    [spaceView.layer layoutSublayers];      
}

Ответы [ 2 ]

5 голосов
/ 26 июля 2009

Если быть точным, в соответствии с Apple документами , CALayer на самом деле является моделью, а не представлением в шаблоне MVC.

"CALayer - класс модели для объектов дерева слоев. Он инкапсулирует положение, размер и преобразование слоя, который определяет его систему координат."

Вид за слоем фактически является частью вида шаблона. Слой не может быть отображен без заднего вида.

Мне кажется, что должен быть совершенно законным кандидатом для сериализации данных. Взгляните на расширения KVC для CALayer. Особенно посмотрите на:

- (BOOL)shouldArchiveValueForKey:(NSString *)key
3 голосов
/ 22 июля 2009

Какао (и Cocoa Touch) в основном основаны на организации модель-представление-контроллер. CALayers находятся на уровне просмотра. Это приводит к двум вопросам:

  1. Какую часть вашей модели представляет ваш слой пользователю?
  2. Как сделать так, чтобы эта часть модели сохранялась?

Ответы на эти вопросы - ваше решение.

В настоящее время для нового приложения самый простой (безусловно, наиболее расширяемый) путь к постоянной модели - это, вероятно, Core Data.

...