Вопрос по uiview, objective-c – Клонировать или Копировать UIViewController или UIView

12

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
какой классself ? MyViewController ? Я думаю, что нет изменяемой копииUIView а такжеUIViewController Raptor

Ваш Ответ

3   ответа
30

Используйте -

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

Так же -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
5

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

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

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

Error: User Rate Limit Exceeded
4

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

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

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

Похожие вопросы