iPhone: estendere una classe UIView
mercoledì 15 luglio, 2009Voglio 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 avviane 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:
-
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:
-
//
-
// ViewLabel.h
-
//
-
-
#import <UIKit/UIKit.h>
-
-
@interface ViewLabel : UIView {
-
UILabel *internalLabel;
-
}
-
-
-
@end
-
//
-
// ViewLabel.m
-
//
-
-
#import "ViewLabel.h"
-
-
@implementation ViewLabel
-
-
- (id)initWithFrame:(CGRect)frame {
-
-
if (self = [super initWithFrame:frame]) {
-
// Initialization code
-
}
-
return self;
-
}
-
-
//
-
// Il nostro nuovo inizializzatore
-
//
-
-
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:
-
ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"];










19

Non ci sono commenti per questo Post
Lascia un commento