2009-07-07 13 views
21

L'oggetto eredita da NSObject.Come duplicare un UIButton nell'obiettivo C?

Esiste un metodo per crearne una copia come nuovo oggetto?

+2

Perché stai cercando copiare un UIButton? Potrebbe esserci un percorso migliore ... –

+3

C'è uno svantaggio nella copia di un UIButton? Ho bisogno di creare dinamicamente nuovi pulsanti basati su uno esistente. –

+0

Duplica un pulsante per creare, ad esempio, una fila di pulsanti. @JamesSkidmore Ecco il codice completo http://stackoverflow.com/a/26438692/294884 – Fattie

risposta

63

UIButton non è conforme a NSCopying, quindi non è possibile fare una copia via -copy.

Tuttavia, è conforme a NSCoding, quindi è possibile archiviare l'istanza corrente, quindi annullare l'archiviazione di una 'copia'.

NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject: button]; 
UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 

In seguito, dovrete assegnare eventuali proprietà aggiuntive che non sono stati riportati in archivio (ad esempio, il delegato), se necessario.

+6

Intelligente! Probabilmente avrei appena aggiunto -copy tramite una categoria, ma è meglio. =) –

+0

Ottima idea, grazie Jim! –

+2

Non è un po 'lento? – mattsven

0

Se implementa il protocollo NSCopying, il metodo dovrebbe fare il trucco.

+0

Sto provando a copiare un UIButton. Qualche idea? –

0

È possibile ottenere ulteriori informazioni sul metodo e su come funziona con gli oggetti secondari sul sito di riferimento ADC. Come menziona Stephen Darlington, è necessario implementare il protocollo NSCopying nel proprio oggetto.

documentation

4

UIButton non è conforme al protocollo NSCopying, quindi è necessario copiarlo a mano. D'altra parte, non è una cosa negativa, dal momento che non è esattamente chiaro cosa significhi copiare un pulsante. Ad esempio, dovrebbe aggiungere la copia del pulsante alla stessa vista in cui si trova l'originale? Dovrebbe sparare gli stessi metodi quando toccato?

3

Per aggiungere alla risposta di Jim sopra utilizzando una categoria

@implementation UIButton (NSCopying) 

- (id)copyWithZone:(NSZone *)zone { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    UIButton *buttonCopy = [NSKeyedUnarchiver unarchiveObjectWithData: archivedData]; 
    return buttonCopy; 
} 

@end 

se si voleva copiare tutte le azioni da un tasto all'altro, aggiungere qualcosa di simile:

for (id target in button.allTargets) { 
    NSArray *actions = [button actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
    for (NSString *action in actions) { 
     [newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside]; 
    } 
} 
Problemi correlati