Objective-C usa typedef enum per impostare il comportamento di classe, come il cacao
Domanda
Sto estendendo la classe UIButton per poter impostare il carattere e il colore di UINavigationBarButton (da questo esempio di codice: attiva il codice )
Vado così:
@interface NavBarButtonGrey : UIButton
-(id)init;
@end
@implementation NavBarButtonGrey
-(id)init {
if(self = [super init]) {
self.frame = CGRectMake(0, 0, 49.0, 30.0);
self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
UIImage *image = [UIImage imageNamed:@"greyNavButton.png"];
UIImage *stretchImage =
[image stretchableImageWithLeftCapWidth:15.0 topCapHeight:0.0];
[self setBackgroundImage:stretchImage forState:UIControlStateNormal];
self.backgroundColor = [UIColor clearColor];
[self setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal];
self.titleShadowOffset = CGSizeMake(0, -1);
self.titleLabel.font = [UIFont boldSystemFontOfSize:13];
}
return self;
}
@end
Questo è ok, ma ovviamente non molto flessibile. Come posso incorporare usando un typedef enum (come fa Apple) per tutti i diversi colori, caratteri e dimensioni a cui vorrei che il mio pulsante personalizzato fosse conforme.
L'unica cosa che posso ottenere dai file di interfaccia di UIKit è che è fatto in questo modo:
typedef enum {
RGCustomNavBarButtonStyleBlue,
RGCustomNavBarButtonStyleGrey,
RGCustomNavBarButtonStyleBlack,
RGCustomNavBarButtonStyleGreen,
RGCustomNavBarButtonStyleRed,
} RGCustomNavBarButtonStyle;
Come ottenere da questo e in un'implementazione funzionante che prende carattere, dimensione, colore ecc. dai valori dell'enum attraverso il costruttore (initWithStyle)?
Si sovraccarica i costruttori nell'obiettivo C? costruttori multipli?
Spero abbia senso e grazie per l'aiuto dato :)
Soluzione
Puoi avere più costruttori come;
-(MyClass) initWithFont: (UIFont) font;
-(MyClass) initWithFonmt: (UIFont) font andColor: (UIColor) color;
ecc.
Quindi chiama [super init] come prima riga in ciascuno dei tuoi costruttori personalizzati.
Altri suggerimenti
Per espandere ciò che ennuikiller ha detto sopra, mi è stato insegnato (il libro di Hillegass) a scegliere un inizializzatore — di solito quello con il maggior numero di opzioni, come il tuo initWithFont: eColor: —e chiedi agli altri inizializzatori di chiamarlo. L'inizializzatore principale viene definito inizializzatore designato.
Quindi il tuo codice avrebbe un initWithFont completamente implementato: andColor: che chiama [super init], e quindi avresti anche un initWithFont: che assomiglia a questo:
-(MyClass) initWithFont: (UIFont) font
{
[self initWithFont:font andColor:RGCustomNavBarButtonStyleBlack];
}
Quindi initWithFont: andColor: gestirà tutte le altre impostazioni e chiamerà [super init].