2010-01-18 9 views
1

permet de dire que j'ai un peu de code, je voudrais répéter plusieurs fois. Comment est-ce que je devrais inclure ceci au mieux dans mon application d'iPhone pour écrire seulement ceci une fois?iPhone appel de répétition d'un code de sélection

Son contrôleur une application typique. TableView

//Set Icon 
     UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(30,25,20,20)]; 
     imgView.image = [UIImage imageNamed:@"ico-date.png"]; 
     [self.view addSubview:imgView]; 

Cordialement

+0

Il existe un problème de mise en mémoire cache avec les images et imageNamed :. Vous devriez probablement utiliser imageWithContentsOfFile: pathForResource: ofType :. Voir aussi http://stackoverflow.com/questions/806374/iphone-most-memory-effecient-way-to-initialize-an-image. – martinr

+0

Désolé je voulais dire: [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "ico-date" deType: @ "png"]]. – martinr

Répondre

4

Vos options:

1) Créer une Fonction statique C pour le faire

static UIImageView* myfunc(CGFloat x, CGFloat y, CGFloat w, CGFloat h, 
    NSString* name, NSString* type, UIView* parent) { 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame: 
     CGRectMake(x,y,w,h)]; 
    imgView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
     pathForResource:name ofType:type]]; 
    [self.view addSubView:imgView]; 
    [imgView release]; 
    return imgView; 
} 

2) Insérer un C macro

#define CREATE_ICON_VIEW(parent,x,y,w,h,name) \ 
    ... 

3) créer une méthode statique Objective-C

// in @interface section 
+ (UIImageView*)addIconWithRect:(CGRect)rect name:(NSString*)name 
    type:(NSString*)type toView:(UIView*)view; 

// in @implementation section 
+ (UIImageView*)addIconWithRect:(CGRect)rect name:(NSString*)name 
    type:(NSString*)type toView:(UIView*)view { 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect]; 
    imgView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
    pathForResource:name ofType:type]]; 
    [self.view addSubView:imgView];  } 
    [imgView release]; 
    return imgView; 
} 

// somewhere in app code 
[MyClass addIconWithRect:CGMakeRect(0,0,32,32) name:@"ico-date" 
    type:@"png" toView:parentView]; 

4) créer une catégorie Objective-C sur UIImage ou UIImageView

5) Insérer un méthode sur la vue qui doit avoir un UIImageView ajouté

- (void)addIconWithRect:(CGRect)rect name:(NSString*)name type:(NSString*)type { 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect]; 
    imgView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
    pathForResource:name ofType:type]]; 
    [self.view addSubView:imgView];  } 
    [imgView release]; 
    return imgView; 
} 

6) Créer un assistant ss

Comme l'option (3), mais mettre les méthodes statiques dans une classe distincte qui est juste pour les méthodes d'utilité pour les sections répétées de code par exemple appeler la classe d'aide « UIUtils ».

7) Utiliser une fonction en ligne C

static inline UIImageView* myfunc(CGFloat x, CGFloat y, CGFloat w, CGFloat h, 
    NSString* name, NSString* type, UIView* parent) { 
    UIImageView *imgView = [[UIImageView alloc] initWithFrame: 
     CGRectMake(x,y,w,h)]; 
    imgView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
     pathForResource:name ofType:type]]; 
    [self.view addSubview:imgView]; 
    [imgView release]; 
    return imgView; 
} 

8) utiliser une boucle pour exécuter le même code à plusieurs reprises

9) utiliser une méthode non statique-C Objectif ordinaire

personnellement Je n'irais pour aucun de ceux-ci pour votre exemple particulier et je l'écrirais simplement à main levée, à moins qu'il ne soit répété plus de dix fois dans un fichier auquel cas je pourrais y aller (3). Si c'est utilisé dans beaucoup de fichiers, je pourrais y aller (6). Éditer: Les descriptions étendues pour (3) et (6) et noter quand j'utilise (6).

Édition: Options ajoutées 8 & 9. Correction de fuites de mémoire et de certaines erreurs.

Modifier: Code mis à jour pour utiliser imageWithContentsOfFile au lieu de imageNamed.

+1

Vous pouvez passer un 'CGRect' dans les fonctions C. – kennytm

+0

sur le 3) Créer une méthode statique Objective-C, où va le premier bit, appDelegate? et alors qu'est-ce que je mets pour 'MyClass'? – oberbaum

+0

C'est une méthode statique donc c'est par exemple "XYZAppDelegate" (le * nom de la classe *) PAS par exemple "appDelegate" le nom de la variable où j'ai écrit MyClass. – martinr

0

Il y a deux façons

  • Sous-classing

Collez ceci dans une classe de base et juste hériteront de cela, pas muss pas de chichi

  • Méthode partagée

Paramétriez l'utilisation de self et transmettez plutôt UIView * comme paramètre que vous souhaitez ajouter. Puis collez cette méthode dans une seule classe accessible de partout et appelez-la seulement lorsque cela est approprié.

  • Catégorie

Créer une catégorie comme UIImageView + icône et mettre le code là, vous pouvez réduire à quelque chose comme [self.view addSubview:[UIImageView icon:@"ico-date.png"]]