iPhone: estendere una classe UIView

mercoledì 15 luglio, 2009

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 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:

Objective-C:
  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:

Objective-C:
  1. //
  2. //  ViewLabel.h
  3. //
  4.  
  5. #import <UIKit/UIKit.h>
  6.  
  7. @interface ViewLabel : UIView {
  8.     UILabel *internalLabel;
  9. }
  10.  
  11. - (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine;
  12.  
  13. @end

Objective-C:
  1. //
  2. //  ViewLabel.m
  3. //
  4.  
  5. #import "ViewLabel.h"
  6.  
  7. @implementation ViewLabel
  8.  
  9. - (id)initWithFrame:(CGRect)frame {
  10.    
  11.     if (self = [super initWithFrame:frame]) {
  12.         // Initialization code
  13.     }
  14.     return self;
  15. }
  16.  
  17. //
  18. // Il nostro nuovo inizializzatore
  19. //
  20. - (id)initWithLabelDefine:(CGRect)frame label:(NSString *)labelDefine {
  21.    
  22.     if (self = [super initWithFrame:frame]) {
  23.         // qui potete decidere voi come comportarvi, io per
  24.         // sicurezza ho preso lo stesso frame passato negli
  25.         // input ma ho azzerato la x e la y
  26.         frame.origin.x = 0;
  27.         frame.origin.y = 0;
  28.         internalLabel = [[UILabel alloc] initWithFrame: frame];
  29.         internalLabel.text = labelDefine;
  30.         [self addSubview:internalLabel];
  31.         [internalLabel release];
  32.     }
  33.     return self;
  34. }
  35.  
  36. - (void)drawRect:(CGRect)rect {
  37.     // Drawing code
  38. }
  39.  
  40. - (void)dealloc {
  41.     [super dealloc];
  42. }
  43.  
  44. @end

Al momento della creazione della nostra nuova classe, potremmo usare:

Objective-C:
  1. ViewLabel *vl = [[ViewLabel alloc] initWithLabelDefine:CGRectMake(0,0,320,80) label:@"Ciao"];

Post correlati

Questo articolo ti è stato utile?: Per nientePocoAbbastanzaMoltoMoltissimo
Loading ... Loading ...

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
[as][/as]           // Actionscript
[css][/css]         // CSS Style Sheet
[html][/html]       // HTML
[js][/js]           // Javascript
[objc][/objc]       // Objective-C
[php][/php]         // PHP
[sql][/sql]         // SQL