Voglio mostrare come è possibile, in modo semplice e rapido, estendere una classe UIView in modo che risponde ad un nuovo metodo di inizializzazione contenente ulteriore codice per personalizzare l’oggetto UIView creato. Come probabilmente alcuni di voi sapranno, Objective-C non supporta un unico costruttore come avviene in altri linguaggi ad oggetti (come Adobe ActionScript o PHP5). E’ possibile, infatti, creare un’istanza di una classe richiamando manualmente diversi costruttori (virtualmente infiniti). Normalmente siamo abituati a creare oggetti UIView con il classico initWithFrame. Immaginiamo però di voler creare una nuova classe di oggetti visuali, a partire da una UIView, con qualche aggiunta; ad esempio una label incorporata. In pratica quello che vogliamo ottenere è che instanziando il nostro oggetto questo crei, oltre che alla UIView, anche un oggetto di tipo UILabel. Ad esempio potremmo voler ottenere alla fine:
1 | ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"]; |
Per ottenere questo basta semplicemente creare una nuova classe di tipo UIView e chiamarla ViewLabel:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // // ViewLabel.h // #import <UIKit/UIKit.h> @interface ViewLabel : UIView { UILabel *internalLabel; } - (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | // // ViewLabel.m // #import "ViewLabel.h" @implementation ViewLabel - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // Initialization code } return self; } // // Il nostro nuovo inizializzatore // - (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine { if (self = [super initWithFrame:frame]) { // qui potete decidere voi come comportarvi, io per // sicurezza ho preso lo stesso frame passato negli // input ma ho azzerato la x e la y frame.origin.x = 0; frame.origin.y = 0; internalLabel = [[UILabel alloc] initWithFrame: frame]; internalLabel.text = labelDefine; [self addSubview:internalLabel]; [internalLabel release]; } return self; } - (void)drawRect:(CGRect)rect { // Drawing code } - (void)dealloc { [super dealloc]; } @end |
Al momento della creazione della nostra nuova classe, potremmo usare:
1 | ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"]; |








7
Non ci sono commenti per questo Post
Lascia un commento