Просто используя этот способ:
UIView* view2 = [view1 copy]; // view1 existed
Это приведет к тому, что симулятор не сможет запустить это приложение.
Попробуй сохранить,
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
Любые изменения view2
будут применяться view1
, я понимаю , что view2
доля такого же память с view1
.
Почему нельзя UIView
скопировать? Какова причина?
ios
objective-c
uiview
copy
Форрест
источник
источник
это может сработать для вас ... заархивируйте представление, а затем сразу же разархивируйте его. Это должно дать вам полную копию представления:
id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
источник
UIImageView
s :(Вы можете сделать расширение UIView. В приведенном ниже примере быстрого фрагмента функция copyView возвращает AnyObject, поэтому вы можете скопировать любой подкласс UIView, то есть UIImageView. Если вы хотите скопировать только UIView, вы можете изменить тип возвращаемого значения на 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()
источник
для swift3.0.1:
extension UIView{ func copyView() -> AnyObject{ return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject } }
источник
UIView
не реализуетNSCoping
протокол, см. объявление в UIView.h :@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>
Итак, если мы хотим иметь
copy
подобный метод, нам нужно реализоватьNSCoping
протокол в категории или около того.источник
Вы можете сделать метод примерно таким:
-(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];
источник