NSView nach NSView kopieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSView nach NSView kopieren

    Sorry ich glaube das ich das erste in einem falschen Bereich gepostet habe.

    Hier meine Frage.

    Versuche schon seit Tagen ein NSView in ein anderes zu kopieren. Habe stundenlang im Google gesucht aber immer nur etwa unverständliche oder inkompatible (für ältere XC/SWIFT) Beispiele gefunden.
    Die letzte Version ist diese aber ich weiß nicht wie ich sie einsetzen soll.


    // Copy NSView
    public func insecureCopy<T: NSCoding>(of original: T) throws -> T {
    /// Approach 4
    /// It seems theres a solution after all!!
    ///See developer.apple.com/forums/thread/107533
    if #available(macOS 10.13, *) {
    let data = try NSKeyedArchiver.archivedData(withRootObject: original, requiringSecureCoding: false)
    let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
    unarchiver.requiresSecureCoding = false
    let copy = unarchiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! T
    return copy
    } else { /// Fallback (untested)
    let data = NSKeyedArchiver.archivedData(withRootObject: original)
    let unarchiver = NSKeyedUnarchiver(forReadingWith: data)
    unarchiver.requiresSecureCoding = false
    let copy = unarchiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! T
    return copy
    }
    }


    Wäre nett wenn mir jemand helfen könnte. Danke
  • Da NSView nicht das NSCopying-Protokoll unterstützt, muss Du dies implementieren. Letztlich ist nur eine Methode copyWithZone: nötig, die eine kopierte Instanz des View zurückgibt.

    Das oben von Dir zitierte Code-Segment will diese Kopie erzeugen, indem es das Ursprungsobjekt serialisiert und dann wieder in ein neues Objekt deserialisiert. Dies erfordert allerdings das NSCoding-Protokoll, welches NSView ebenfalls nicht unterstützt. Insofern funktioniert dieser Ansatz m. E. nicht.

    Du müsstest selber eine neue NSView-Instanz erzeugen und deren Eigenschaften aus der Original-View übernehmen. Je nach Deiner Erwartung kann dies etwas aufwändiger werden, z. B. enthaltene SubViews. Eine komplette Kopie mit allen Eigenschaften stelle ich mir sehr schwierig vor ... allerdings würde mich auch Dein Anwendungsfall dafür interessieren (und ob ich vielleicht einen smarten Weg übersehen habe).

    Mattes

    P.S.: Wäre schön, wenn Du bei zukünftigen Postings Code als solchen formatieren könntest. Und wenn es für Dich okay ist, würde ich den parallelen Thread im Unter-Forum löschen?
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:


    Das oben von Dir zitierte Code-Segment will diese Kopie erzeugen, indem es das Ursprungsobjekt serialisiert und dann wieder in ein neues Objekt deserialisiert. Dies erfordert allerdings das NSCoding-Protokoll, welches NSView ebenfalls nicht unterstützt. Insofern funktioniert dieser Ansatz m. E. nicht.
    Du hast Deinen Code scheinbar aus diesen SO-Artikel, der versucht, die Methode insecureCopy über den NSKeyedArchiver nachzuliefern. Mich wundert die Aussage, NSCoding würde von NSView unterstützt, die oben verlinkte Dokumentation zeigt das nicht. Aber implementiere die Methode einfach in Deiner NSView-Objektklasse, dann wirst Du beim Aufruf von insecureCopy ja schnell evt. Fehler sehen...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Das oben von Dir zitierte Code-Segment will diese Kopie erzeugen, indem es das Ursprungsobjekt serialisiert und dann wieder in ein neues Objekt deserialisiert. Dies erfordert allerdings das NSCoding-Protokoll, welches NSView ebenfalls nicht unterstützt. Insofern funktioniert dieser Ansatz m. E. nicht.
    Das ist nicht korrekt. NSView erbt NSCoding von NSResponder. Das ist auch notwendig, weil darauf ja schließlich die NIB-Deserialisierung funktioniert. Ich würde mich aber nicht unbedingt darauf verlassen, ob die Serialisierung in NSView und Unterklassen immer sauber und zuverlässig implementiert ist.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Das ist nicht korrekt. NSView erbt NSCoding von NSResponder. Das ist auch notwendig, weil darauf ja schließlich die NIB-Deserialisierung funktioniert.
    Arrgghh ... Du hast natürlich recht! Danke für's Korrigieren :)

    Warum weisst die Doku es dann nicht aus? Schliesslich müsste eine NSView doch mehr als nur ein NSResponder serialisieren... Ich versteh's nicht.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.