2012-11-02 13 views
33

Ho fatto alcune domande sullo stack overflow sulla sottoclasse di uno UIButton e un paio di persone mi hanno informato che non dovrei sottoclasse uno UIButton.Perché non dovrei sottoclasse un UIButton?

Quali sono i negativi della sottoclasse di uno UIButton? E so che è vago, ma quali sono le alternative alla sottoclasse di un UIButton?

+1

Qual è il motivo della sottoclasse di un UIButton? Specificare il tipo di pulsante 'personalizzato'. Cos'altro è necessario? –

+0

Stavo chiedendo di più solo se voglio sottoclassi in futuro, perché non dovrei farlo. Ma in questo momento avrò circa 20 bottoni nella mia app che hanno lo stesso sfondo, font, dimensioni del padding attorno al testo, ecc. Quindi ho voluto creare un po 'di tempo e codice per sottoclassi. – KKendall

+2

Non c'è motivo per cui non sia possibile sottoclasse UIButton. In effetti, lo faccio in modo che possa usare IB per definire l'aspetto del mio pulsante. Perché? Flessibilità di design Molte persone hanno sottometto UIButton. Ho sottoclasse UIButton. Questa convinzione che non può essere qualcosa che si ripete ma manca di prove. –

risposta

35

I framework Cocoa adottano l'approccio secondo cui il modello di composizione degli oggetti è più appropriato della tradizionale gerarchia di classi.

In generale, questo significa che è probabile che ci sia una proprietà su UIButton in cui è possibile impostare un altro oggetto per gestire vari aspetti del pulsante. Questo è il modo preferito per "personalizzare" il funzionamento del tuo pulsante.

Uno dei motivi principali di questo modello è che molti componenti della libreria creano pulsanti e non sanno che si desidera che creino istanze della sottoclasse.

modificare il proprio metodo factory

ho notato il tuo commento sopra circa risparmiare tempo quando si ha lo stesso pulsante di configurazione in molti pulsanti nella vostra app. Questo è un ottimo momento per utilizzare il modello di progettazione metodo di fabbrica e in Objective-C è possibile implement it with a Category quindi è disponibile direttamente su UIButton.

@interface UIButton (MyCompanyFactory) 
+(UIButton *) buttonWithMyCompanyStyles; 
@end 
@implementation UIButton 
+(UIButton *) buttonWithMyCompanyStyles { 
    UIButton *theButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    // [theButton set... 
    return theButton; 
} 
@end 
+0

Anche se importante per la progettazione, non sono sicuro che "la composizione preferita" sia davvero una buona risposta alla domanda, perché "UIButton" è effettivamente idiosincratico in questo senso. di certo non farò un downvote perché il tuo post ha dei buoni punti (in effetti, ho upvoted). – justin

+0

@justin, sono sempre a favore di una buona conversazione! Hai blog ovunque, o hai un link ad una discussione correlata da qualche parte? –

+3

Ho aggiunto un collegamento dagli elenchi Cocoa-Dev nella mia risposta sull'argomento. Se vuoi raggiungermi, sei certamente il benvenuto a inviarmi messaggi privati ​​o pubblici via Twitter (l'handle è nel mio profilo SO). Io non blog - SO è il mio refrigeratore d'acqua principale per la codifica. Tengo un basso profilo. – justin

15

È perché UIButton è una specie di speciale in quanto ci sono alcune sottigliezze le complessità// restrizioni (cioè le sostituzioni aggiuntive per di definire, in particolare +buttonWithType:) necessari al fine di farlo funzionare come previsto. È più del solito -initWithFrame: (e -initWithCoder:, se usato in XIBs). IDK perché gli autori di framework hanno permesso a questi dettagli di filtrare nel nostro dominio, ma è qualcosa che deve essere affrontato da noi ora. La restrizione è che la tua implementazione non deve dipendere (cioè estendere) gli stili dei pulsanti di sistema preimpostati; È necessario assumere UIButtonTypeCustom come punto di partenza per una sottoclasse UIButton.


On implementing a subclass of UIButton

10

Se siete solo in cerca di qualcosa di più leggero, con il proprio 'subviews' si dovrebbe invece essere sottoclasse UIControl. UIButton sottoclassi UIControl e in grado di gestire eventi, come:

[mySubclassedButtonFromUIControl addTarget:self action:@selector(_doSomething:) forControlEvents:UIControlEventTouchUpInside]; 

sottoclassi UIControl UIView in modo da poter layoutSubviews modo pulito su eventuali pareri contenuti in sottoclasse UIControl ed evitare inutili viste che vengono con UIButton. In sostanza stai solo creando il tuo 'UIButton' ma eviti di dover aggirare comportamenti e funzionalità che non vuoi o non hai bisogno.

Problemi correlati