Подтвердить что ты не робот

Дублировать, клонировать или копировать UIView

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

@implementation UIView (OPCloning)

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

@end

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

Ответ 3

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

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

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

Ответ 4

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

extension UIView{
func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}