web-dev-qa-db-fra.com

UIView peut-il être copié?

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?

81
Forrest

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.

33
Engin Kurutepe

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]];
159
j2emanue

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()
24
Ivan Porkolab

pour Swift3.0.1:

extension UIView{
 func copyView() -> AnyObject{
    return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
 }
}
6
Sour LeangChhean

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.

1
HongchaoZhang