Можно ли скопировать UIView? - PullRequest
81 голосов
/ 13 декабря 2010

Просто используя этот способ:

UIView* view2 = [view1 copy]; // view1 existed

Это приведет к тому, что симулятор не сможет запустить это приложение.

Попробуйте сохранить,

UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc

Любые модификации view2 будут применяться к view1, я понимаю, что view2 совместно использует ту же память с view1.

Почему нельзя скопировать UIView? В чем причина?

Ответы [ 6 ]

158 голосов
/ 07 декабря 2012

это может сработать для вас ... заархивировать представление и сразу же разархивировать егоЭто должно дать вам глубокую копию представления:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
33 голосов
/ 15 января 2011

Ваше приложение, вероятно, аварийно завершает работу с чем-то вроде:

 [UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280

Причина в том, что UIView не реализует протокол копирования, и поэтому в UIView нет селектора copyWithZone.

24 голосов
/ 22 декабря 2015

Вы можете сделать расширение UIView. В приведенном ниже примере быстрого кода функция copyView возвращает AnyObject, чтобы вы могли скопировать любой подкласс UIView, т.е. UIImageView. Если вы хотите скопировать только UIViews, вы можете изменить тип возвращаемого значения на UIView.

//MARK: - UIView Extensions

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

Пример использования:

let sourceView = UIView()
let copiedView = sourceView.copyView()
6 голосов
/ 20 марта 2017

для swift3.0.1:

extension UIView{
 func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}
1 голос
/ 21 июля 2016

UIView не реализует протокол NSCoping, см. Объявление в UIView.h :

@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>

Итак, если мы хотимчтобы иметь copy подобный метод, нам нужно реализовать протокол NSCoping в категории или около того.

0 голосов
/ 15 апреля 2011

Вы можете сделать метод примерно таким:

-(UILabel*)copyLabelFrom:(UILabel*)label{
//add whatever needs to be copied
UILabel *newLabel = [[UILabel alloc]initWithFrame:label.frame];
newLabel.backgroundColor = label.backgroundColor;
newLabel.textColor = label.textColor;
newLabel.textAlignment = label.textAlignment;
newLabel.text = label.text;
newLabel.font = label.font;

return [newLabel autorelease];

}

Затем вы можете установить свой ivar на возвращаемое значение и сохранить его так:

myLabel = [[self copyLabelFrom:myOtherLabel] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...