Frage an uiviewcontroller, copy, clone, uiview, objective-c – Klonen oder Kopieren von UIViewController oder UIView

12

UII brauchen Kopie, Selbstkontrolle oder self.view, ich habe versucht:

UIView* viewOfSelf =[self.view copy];
UIViewController* controller = [self copy];

UIView* viewOfSelf =[self.view mutableCopy];
UIViewController* controller = [self mutableCopy];

Der Fehler ist:

    -[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0
Was ist die Klasse vonself ? MyViewController ? Ich denke, es gibt keine veränderbare Kopie vonUIView undUIViewController Raptor

Deine Antwort

3   die antwort
30

Benutzen -

NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view];
UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView];

Ähnlich -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self];
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController];
Erhält nicht alles wie benutzerdefinierte Gesten usw. jjxtra
Hmm hat meine UIImageView nicht erhalten, die ich als Unteransicht der Ansicht hatte, die ich geklont habe. Carl Hine
5

NSCopying Protokoll welchesUIView Klasse nochUIViewController Klasse nicht.

Wenn Sie eine Ansicht kopieren möchten, sind Sie sich ziemlich sicher, dass Sie etwas falsch machen. Das Kopieren sollte durch wiederverwendbares ersetzt werdenUIView genau wie inUITableView mitdequeueReusableCellWithIdentifier: Methode.

Der Kopier-View-Controller ist definitiv ein Anti-Pattern. Wenn Sie eine exakte Kopie des bereits vorhandenen Ansichtscontrollers möchten, erstellen Sie eine neue Instanz mit denselben Parametern wie bei der aktuellen.

Obwohl Rishis Antwort auch für mich funktionierte, erwies sich das Erstellen neuer Instanzen als zuverlässigere Lösung für mein Problem. Vielen Dank! Myxtic
4

aber Rishis Lösung hat ein Problem: Sie kopiert nichtNSLayoutConstraints. Wenn also eine Ihrer Ansichten Autolayout verwendet, werden diese nicht kopiert. Ich schreibe eine Mini-Bibliothek, um das zu lösen und werde sie, wenn sie fertig ist, auf Github veröffentlichen. Leider habe ich nirgendwo eine gebrauchsfertige Lösung gefunden.

//Bearbeiten

Sorry, was ich vorher geschrieben habe war nicht ganz korrekt. Ich habe etwas mehr recherchiert und es stellt sich heraus, dass standardmäßig dieNSLayoutConstraints in der archivierten Ansicht werden NICHT gespeichert. Sie können jedoch tatsächlich angeben, ob Sie eine Einschränkung archivieren möchten, indem Sie deren Einstellung festlegenshouldBeArchived Eigentum anYES. Dann auch noch nach dieser FälschungcopyBehalten Sie die richtigen Einschränkungen in der kopierten Ansicht.

Verwandte Fragen