Einfach auf diese Weise:
UIView* view2 = [view1 copy]; // view1 existed
Dies wird dazu führen, dass der Simulator diese App nicht starten kann.
Versuchen Sie zu behalten,
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
Änderungen an view2
gilt für view1
, Ich verstehe das view2
teile den gleichen Speicher mit view1
.
Warum kann UIView
nicht kopiert werden? Was ist der Grund?
Ihre App stürzt wahrscheinlich ab mit:
[UIView copyWithZone:]: unrecognized selector sent to instance 0x1c6280
Der Grund dafür ist, dass UIView das Kopierprotokoll nicht implementiert und daher in UIView kein Selektor copyWithZone
vorhanden ist.
das könnte für Sie funktionieren ... archivieren Sie die Ansicht und entarchivieren Sie sie direkt danach. Dies sollte Ihnen eine tiefe Kopie einer Ansicht geben:
id copyOfView =
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]];
Sie können eine UIView-Erweiterung vornehmen. In Beispiel Swift Schnipsel unten gibt die Funktion copyView ein AnyObject zurück, sodass Sie jede Unterklasse einer UIView kopieren können, dh UIImageView. Wenn Sie nur) kopieren möchten UIViews Sie können den Rückgabetyp in UIView ändern.
//MARK: - UIView Extensions
extension UIView
{
func copyView<T: UIView>() -> T {
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T
}
}
Anwendungsbeispiel:
let sourceView = UIView()
let copiedView = sourceView.copyView()
für Swift3.0.1:
extension UIView{
func copyView() -> AnyObject{
return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self))! as AnyObject
}
}
UIView
implementiert das NSCoping
-Protokoll nicht, siehe Deklaration in IView.h:
@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>
Wenn wir also eine copy
-ähnliche Methode haben möchten, müssen wir das NSCoping
-Protokoll in einer Kategorie oder so implementieren.