2012-05-16 3 views
12

UII нужно копировать, самостоятельно или контроллер self.view, я попробовал:Clone или Копировать UIViewController или UIView

UIView* viewOfSelf =[self.view copy]; 
UIViewController* controller = [self copy]; 

UIView* viewOfSelf =[self.view mutableCopy]; 
UIViewController* controller = [self mutableCopy]; 

Ошибка:

-[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490 
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0 
+0

Что такое класс 'self'? 'MyViewController'? Я думаю, что нет никакой изменчивой копии 'UIView' и' UIViewController' – Raptor

ответ

30

Применение -

NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view]; 
UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView]; 

Аналогично -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self]; 
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController]; 
+2

Не получает все, как пользовательские жесты и т. Д. – jjxtra

+0

Хмм не получил мой UIImageView, который у меня был как подвид представления, которое я клонировал. –

5

Для объекта быть копируемой он должен осуществить NSCopying протокол, который UIView класс не UIViewController класс нет.

Если вы хотите скопировать вид, я уверен, что вы делаете что-то неправильно. Копирование должно быть заменено на повторное использование UIView, как в UITableView, используя метод dequeueReusableCellWithIdentifier:.

Контроллер просмотра копий определенно является анти-шаблоном. Если вам нужна точная копия контроллера вида, который у вас уже есть, создайте новый экземпляр с теми же параметрами, что и текущий.

+1

. Ответ Eventhough тоже работал на меня, но создание новых экземпляров оказалось более надежным решением для моей проблемы. Благодаря! – Myxtic

4

К сожалению, я пока не разрешено комментировать, но решение Риши есть одна проблемы: она не копирует NSLayoutConstraint с. Поэтому, если какой-либо из ваших просмотров использует автозапуск, эти файлы не будут скопированы. Я пишу мини-lib, чтобы решить это, и опубликую его до github, когда закончите. К сожалению, я не нашел готового к использованию решения в любом месте.

// Редактировать

К сожалению, то, что я писал ранее не было совершенно правильно. Я сделал еще несколько исследований, и оказалось, что по умолчанию NSLayoutConstraint s в архиве не сохраняются. Но вы можете указать, хотите ли вы архивировать ограничение, установив его свойство shouldBeArchived на YES. Затем, даже после этой подделки copy, вы сохраняете правильные ограничения в скопированном представлении.