wake-up-neo.com

Kann UIView kopiert werden?

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?

81
Forrest

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.

33
Engin Kurutepe

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

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

für Swift3.0.1:

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

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.

1
HongchaoZhang