Дублируйте, клонируйте или копируйте UIView - PullRequest
22 голосов
/ 15 февраля 2011

У меня есть UIView, который связан с UIViewController через Интерфейсный Разработчик. Можно ли дублировать, клонировать или скопировать это представление, чтобы я мог использовать его более одного раза?

Ответы [ 4 ]

30 голосов
/ 02 декабря 2012

Следующая категория может быть не особенно эффективной, но она работала для меня в одном проекте:

@implementation UIView (OPCloning)

- (id) clone {
    NSData *archivedViewData = [NSKeyedArchiver archivedDataWithRootObject: self];
    id clone = [NSKeyedUnarchiver unarchiveObjectWithData:archivedViewData];
    return clone;
}

@end

Я бы не реализовал -copy или -copyWithZone: как Apple может сделать это в будущем.Обратите внимание, что не все представления реализуют архивирование в одинаковой степени.Вам определенно нужно будет реализовать методы NSCoding для клонирования пользовательских свойств ваших подклассов NSView (в противном случае в клонированном представлении будет установлено значение nil).Все еще проще, чем написание собственного кода клонирования.

14 голосов
/ 09 апреля 2015

Вот новый метод, который вы можете использовать: Используйте метод UIView:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

Это самый быстрый способ нарисовать вид. Доступно в iOS 7.

3 голосов
/ 20 марта 2017

Вы можете попробовать с Swift 3.0.1 ниже:

extension UIView{
func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}
1 голос
/ 15 февраля 2011

Конечно. В документации есть хороший пример того, как этого добиться ; это для UITableViewCell, но это хороший подход, чтобы использовать и здесь.

В зависимости от сложности вашего представления, вы можете захотеть сделать его настраиваемым классом представления и присвоить ему свои собственные свойства IBOutlet для любых вложенных представлений; в этом случае вы должны установить для этого класса «Class Identity» представления в Interface Builder. Тогда ваш контроллер представления может получить доступ к этим представлениям в любом данном представлении, загруженном XIB, например, через myLoadedView.someLabel, вместо того, чтобы использовать, например, [myLoadedView viewWithTag:3], как предложено в вышеупомянутой документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...