2012-05-16 11 views
12

UII bisogno copia, controllore di auto o self.view, ho provato:clone o copia UIViewController o UIView

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

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

L'errore è:

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

qual è la classe di "sé"? 'MyViewController'? Penso che non ci sia una copia mutevole di 'UIView' e' UIViewController' – Raptor

risposta

30

Usa -

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

Allo stesso modo -

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

Non ottiene tutto come gesti personalizzati, ecc. – jjxtra

+0

Hmm non ha ottenuto il mio UIImageView che ho avuto come sottoview della vista che stavo clonando. –

5

Per un oggetto di essere copiabile essa deve implementare il protocollo NSCopying quale classe UIView o classe UIViewController no.

Se si desidera copiare una vista, sono abbastanza sicuro che stai facendo qualcosa di sbagliato. La copia deve essere sostituita da UIView riutilizzabile come in UITableView utilizzando il metodo dequeueReusableCellWithIdentifier:.

La copia del controller di visualizzazione è decisamente un anti-pattern. Se vuoi una copia esatta del controller della vista che hai già, crea una nuova istanza con gli stessi parametri di quella attuale.

+1

Eventhough Rishi ha funzionato anche per me, ma creare nuove istanze si è dimostrato una soluzione più affidabile per il mio problema. Grazie! – Myxtic

4

Purtroppo non sono ancora permesso di commentare, ma la soluzione di Rishi ha un problema: non copia NSLayoutConstraint s. Quindi, se una delle tue visualizzazioni utilizza l'autolayout, queste non verranno copiate. Sto scrivendo un mini-lib per risolverlo e lo posterò su github quando sarà finito. Sfortunatamente, non ho trovato una soluzione pronta per l'uso ovunque.

// Modifica

Siamo spiacenti, quello che ho scritto in precedenza non era del tutto corretta. Ho fatto qualche ricerca in più e si scopre che, per impostazione predefinita, gli NSLayoutConstraint s nella vista archiviata NON vengono salvati. Tuttavia, è possibile specificare se si desidera archiviare un vincolo impostando la proprietà shouldBeArchived su YES. Quindi, anche dopo questo falso copy, si mantengono i vincoli corretti nella vista copiata.

Problemi correlati