En utilisant simplement cette façon:
UIView* view2 = [view1 copy]; // view1 existed
Cela entraînera le simulateur ne peut pas lancer cette application.
Essayez de conserver,
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
Toute modification de view2
s'appliquera à view1
, Je comprends que view2
partager la même mémoire avec view1
.
Pourquoi ne peut-on pas copier UIView
? Quelle est la raison?
Votre application se bloque probablement avec quelque chose comme:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
La raison en est qu'UIView n'implémente pas le protocole de copie et qu'il n'y a donc pas de sélecteur copyWithZone
dans UIView.
cela pourrait fonctionner pour vous ... archivez la vue, puis désarchivez-la juste après. Cela devrait vous donner une copie complète d'une vue:
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
Vous pouvez créer une extension UIView. Dans l'exemple Swift snippet ci-dessous, la fonction copyView renvoie un AnyObject afin que vous puissiez copier n'importe quelle sous-classe d'un UIView, ie UIImageView. Si vous voulez copier seulement UIViews vous pouvez changer le type de retour en UIView.
//MARK: - UIView Extensions
extension UIView
{
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
Exemple d'utilisation:
let sourceView = UIView()
let copiedView = sourceView.copyView()
pour Swift3.0.1:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
UIView
n'implémente pas le protocole NSCoping
, voir la déclaration dans IView.h:
@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>
Donc, si nous voulons avoir une méthode semblable à copy
, nous devons implémenter le protocole NSCoping
dans une catégorie ou plus.