2012-05-16 9 views
12

UII necesita copiar, controlador de auto o self.view, he intentado:Clon o Copiar UIViewController o UIView

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

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

El error es:

-[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490 
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0 
+0

¿Cuál es la clase de 'self'? 'MyViewController'? Creo que no hay una copia mutable de 'UIView' y' UIViewController' – Raptor

Respuesta

30

Uso -

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

Del mismo modo -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self]; 
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController]; 
+2

No tiene todo, como gestos personalizados, etc. – jjxtra

+0

Hmm no obtuvo mi UIImageView que tuve como una subvista de la vista que estaba clonando. –

5

Para que un objeto sea copiable que debe implementar el protocolo NSCopying que UIView clase ni UIViewController clase no.

Si desea copiar una vista, estoy bastante seguro de que está haciendo algo mal. La copia debe reemplazarse por UIView reutilizable al igual que en UITableView utilizando el método dequeueReusableCellWithIdentifier:.

Copiar el controlador de vista definitivamente es un antipatrón. Si desea una copia exacta del controlador de vista que ya tiene, cree una nueva instancia con los mismos parámetros que la versión actual.

+1

Aunque la respuesta de Rishi también funcionó, la creación de nuevas instancias demostró ser una solución más confiable para mi problema. ¡Gracias! – Myxtic

4

Por desgracia aún no he permitido hacer comentarios, pero la solución de Rishi tiene un problema: no copia NSLayoutConstraint s. Entonces, si alguna de tus vistas usa la función de autodiseño, esas no se copiarán. Estoy escribiendo una mini-lib para resolver eso y lo publicaré en github cuando haya terminado. Desafortunadamente, no he encontrado una solución lista para usar en ningún lado.

// Editar

Lo sentimos, lo que escribí anteriormente no era del todo correcta. Investigué un poco más y resulta que, por defecto, los NSLayoutConstraint s en la vista archivada NO se guardan. Sin embargo, puede especificar si desea archivar una restricción configurando su propiedad shouldBeArchived en YES. Luego, incluso después de este falso copy, conserva las restricciones correctas en la vista copiada.

Cuestiones relacionadas