Архивирование UIImageView с NSCoding - PullRequest
1 голос
/ 14 февраля 2012

Я никогда не использовал NSCoding прежде, и я очень озадачен тем, как это должно быть реализовано.

Мое текущее приложение для iPad имеет UIImageView (называемый «фон»), которое является свойством моего основного контроллера вида. «background» имеет UIImage «image» свойство (очевидно) и различные подпредставления, которые добавляются пользователем. Добавленные подпредставления являются моими собственными подклассами UIImageView.

Мне нужно иметь возможность сохранить состояние «фонового» UIImageView, чтобы его можно было восстановить с тем же изображением и всеми подпредставлениями на месте, как это было при архивировании.

Я понимаю, что UIImageView соответствует протоколу NSCoding, но я не уверен, где реализовать encodeWithCoder и initWithCoder. Я вызываю их с моего основного контроллера вида? Нужно ли создавать категорию для UIImageView, которая позволяет мне переопределять эти методы?

Нужно ли мне писать код для архивирования каждого свойства моего "фонового" UIImageView и его подпредставлений? Я читал в другом месте на SO, что UIImage не соответствует NSCoding, поэтому его необходимо разделить на подклассы или добавить категорию, чтобы иметь возможность архивировать UIImageView.

Я подумал, что будет простой способ сохранить на диск объект, включающий все его свойства, подпредставления и т. Д. Похоже, что мне нужно многое сделать, чтобы сохранить этот "фоновый" UIImageView и восстановить его позже. , Я изо всех сил пытаюсь визуализировать все, что мне нужно сделать. Любые указатели очень ценятся!

1 Ответ

4 голосов
/ 14 февраля 2012

Сериализация (она же архивация и разархивирование) на самом деле довольно сложна, но степень, с которой Какао облегчает задачу, является довольно впечатляющим подвигом.

Как только вы настроите все так, чтобы UIImageView и все его свойства, которые вы хотите сохранить, соответствовали NSCoding, все, что вам нужно сделать, чтобы сохранить объект:

NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:yourImageView];

А потом храните эти NSData где-нибудь. Затем, чтобы разархивировать объект,

UIImageView *restoredImageView = [NSKeyedUnarchiver unarchiveObjectWithData:dataToRestore];

после восстановления NSData откуда-то.

Что касается приведения всего в соответствие с NSCoding, UIImageView соответствует NSCoding, как и UIView, поэтому между вашими UIImageView, его подпредставлениями и их свойствами все, вероятно, соответствует NSCoding, кроме фактический UIImage. Для этого, если вы пользуетесь Google, вы можете найти множество категорий, которые люди сделали, чтобы он соответствовал NSCoding, поэтому просто включите одну из них в ваш проект, и все будет в порядке.

...