У меня есть UIView, связанный с UIViewController через Interface Builder. Можно ли дублировать, клонировать или копировать это представление, чтобы я мог использовать его более одного раза?
Дублировать, клонировать или копировать UIView
Ответ 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
}
}