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
, вы сохраняете правильные ограничения в скопированном виде.