Simplemente usando esta forma:
UIView* view2 = [view1 copy]; // view1 existed
Esto hará que el simulador no pueda iniciar esta aplicación.
Intenta retener
UIView* view2 = [view1 retain]; // view1 existed // modify view2 frame etc
Cualquier modificación a view2
se aplicará a view1
, entiendo que view2
comparta la misma memoria con view1
.
¿Por qué no se puede copiar UIView
? ¿Cual es la razon?
Tu aplicación probablemente se cuelga con algo como:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
La razón es que UIView no implementa el protocolo de copiado y, por lo tanto, no hay selector copyWithZone en UIView.
esto podría funcionar para usted … archivar la vista y luego desarchivarla inmediatamente después. Esto debería darle una copia profunda de una vista:
id copyOfView = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
Puede hacer una extensión UIView. En el siguiente fragmento rápido, la función copyView devuelve AnyObject para que pueda copiar cualquier subclase de UIView, es decir , UIImageView. Si desea copiar solo UIViews, puede cambiar el tipo de devolución a UIView.
//MARK: - UIView Extensions extension UIView { func copyView() -> T { return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T } }
Ejemplo de uso:
let sourceView = UIView() let copiedView = sourceView.copyView()
para swift3.0.1:
extension UIView{ func copyView() -> AnyObject{ return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject } }
UIView
no implementa el protocolo NSCoping
, consulte la statement en UIView.h :
@interface UIView : UIResponder
Entonces, si queremos tener una copy
como método, tenemos que implementar el protocolo NSCoping
en una categoría más o menos.
Puedes hacer un método como este:
-(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]; }
Luego puede configurar su ivar para el valor de retorno y retenerlo así:
myLabel = [[self copyLabelFrom:myOtherLabel] retain];