iPhone: estendere una classe UIView

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"];

Non ci sono commenti per questo Post

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre> // blocco generico
                   <code></code> // blocco generico
                   [cc_actionscript][/cc_actionscript] // Actionscript
                   [cc_actionscript3][/cc_actionscript3] // Actionscript 3
                   [cc_css][/cc_css] // CSS Style Sheet
                   [cc_html][/cc_html] // HTML
                   [cc_js][/cc_js] // Javascript
                   [cc_objc][/cc_objc] // Objective-C
                   [cc_php][/cc_objc] // PHP
                   [cc_sql][/cc_sql] // SQL