Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Objective C: как клонировать UIView?

#objective_c


Доброго времени суток. 
Суть вопроса. Есть два View, в одном находится таблица и кнопка. Нужно клонировать
View с таблицей на другой несколько раз. Подскажите, пожалуйста, как можно это реализовать?
Спасибо.  
PS. После gogle понял, что надо писать функцию типа

-(UIView *)cloneView:(UIView *)myView {  
   ................  
   return cloneView;  
}

А вот что писать вместо точек остается тайной.    


Ответы

Ответ 1



Вот возможные косвенные решения вопроса: 1) UIView duplicate предлагает архивировать UIView: -(UIView *)cloneView:(UIView *)aView { NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self]; id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData]; return clone; } Этот метод должен работать с ограничением на views, которые не могут быть архивированы: Unfortunately, this won't work if your view has any subviews/objects that can't be archived (such as a UIImage) что означает, что если у вас есть картинки, то это решение не сработает. 2) Другое решение You can load a view from a XIB file several times предлагает создать xib-файл с вашим view, чтобы он с помощью [NSBundle.mainBundle loadNibNamed:@"ReusedView" owner:self options:nil]; порождал экземляры этого view. 3) Третье решение предлагает не клонирование, а просто перерисовку оригинального view. 4) Моё предложение: Вы так и не ответили, для чего именно вам понадобилось клонирование - это решение сгодится для не совсем-сложных-и-частных случаев - Вы создаёте для своих view специальные подклассы UIView, в которые добавляете метод: - (id)copyWithZone:(NSZone *)zone { UIView *copyView = [UIView allocWithZone:zone] initWithFrame:self.frame]; // Здесь процедура порождения копии return copyView; } И в теле этого метода скопировать всё содержимое вашего view шаг за шагом. Этот способ мне кажется самым надёжным и удобным. И если вам действительно нужны Клоны, то можно в copyWithZone описать всю вашу, даже возможно сложную, процедуру порождения копии. Да, и кстати, "решение" @Bimawa начнёт работать именно в том виде, в котором он описал. На SO я встречал соображение, что когда-нибудь Apple реализует -[UIView copyWithZone], поэтому ещё раз повторю, что это копирование лучше делать в методе copyWithZone подкласса UIView, а не, скажем, категории типа UIView+Cloning, чтобы не "засорять" UIView и его производные классы.

Ответ 2



UIView *view = [UIView new]; UIView *view2=[view copy];

Ответ 3



Мне тоже понадобился этот "а зачем вам это нужно". Я нашел очень простой и удобный способ делать клоны с использованием шаблонов storyboard. Для этого я создаю в своем объекте myController класса UIViewController нужный объект, например UIView, и кладу его в нижнюю строку конструктора (совершенно не обязательно). Далее создаю на него именованный outlet, например footerShooter. Когда мне нужна копия объекта, я создаю myController *controller, используя storyboard по идентификатору. Далее извлекаю нужный объект по ссылке controller.footerShooter, а от controller избавляюсь. Вот и все.

Ответ 4



UIView *view = [UIView new]; UIView *copyView = [viewsnapshotViewAfterScreenUpdates:YES];

Комментариев нет:

Отправить комментарий