Einfach so:
UIView* view2 = [view1 copy]; // view1 existed
Dies führt dazu, dass der Simulator diese App nicht starten kann.
Versuchen Sie zu behalten,
UIView* view2 = [view1 retain]; // view1 existed
// modify view2 frame etc
Alle Änderungen an view2
gelten view1
, ich verstehe, dass view2
die gleichen Speicher mit teilen view1
.
Warum kann nicht UIView
kopiert werden? Was ist der Grund?
ios
objective-c
uiview
copy
Wald
quelle
quelle
Dies könnte für Sie funktionieren ... Archivieren Sie die Ansicht und entfernen Sie die Archivierung direkt danach. Dies sollte Ihnen eine tiefe Kopie einer Ansicht geben:
quelle
UIImageView
s zu ignorieren :(Sie können eine UIView-Erweiterung erstellen. Im folgenden Beispiel eines schnellen Snippets gibt die Funktion copyView ein AnyObject zurück, sodass Sie eine beliebige Unterklasse eines UIView, dh UIImageView , kopieren können. Wenn Sie nur UIViews kopieren möchten, können Sie den Rückgabetyp in UIView ändern.
Anwendungsbeispiel:
quelle
für swift3.0.1:
quelle
UIView
implementiert dasNSCoping
Protokoll nicht, siehe die Deklaration in UIView.h :@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusEnvironment>
Wenn wir also eine
copy
ähnliche Methode haben möchten, müssen wir dasNSCoping
Protokoll in einer Kategorie oder so implementieren .quelle
Sie können eine Methode wie folgt erstellen:
Dann können Sie Ihren ivar auf den Rückgabewert setzen und ihn wie folgt beibehalten:
quelle