Clone или Copy UIViewController или UIView

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

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

Ответ 1

Использование -

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

Аналогично -

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

Ответ 2

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

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

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

Ответ 3

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

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

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