2010-11-04 15 views
1

Ceci est quelque chose que j'ai jamais été en mesure d'obtenir mon cerveau autour ...instancier un montant fixe d'objets uniques à partir d'une seule méthode

Disons que je suis la construction d'une grille de 8 UIViews large par 8 UIViews haute. Il pourrait par tout x, y ensemble. Il ne doit pas être 8 x 8. Soyons juste arbitraires et tenons-nous-y pour l'instant.

Cette méthode d'initialisation (partie d'une sous-classe de UIView) génère une ligne 8 UIViews large:

- (id)initWithFrame:(CGRect)frame { 

if ((self = [super initWithFrame:frame])) { 

    int x = 1; 
    int y = 1; 

    //row 01 
    UIView* row01Square01 = [[UIView alloc] initWithFrame:CGRectMake((0*x), (0*y), x, y)]; 
    [self addSubview:row01Square01]; 

    UIView* row01Square02 = [[UIView alloc] initWithFrame:CGRectMake((1*x), (0*y), x, y)]; 
    [self addSubview:row01Square02]; 

    UIView* row01Square03 = [[UIView alloc] initWithFrame:CGRectMake((2*x), (0*y), x, y)]; 
    [self addSubview:row01Square03]; 

    UIView* row01Square04 = [[UIView alloc] initWithFrame:CGRectMake((3*x), (0*y), x, y)]; 
    [self addSubview:row01Square04]; 

    UIView* row01Square05 = [[UIView alloc] initWithFrame:CGRectMake((4*x), (0*y), x, y)]; 
    [self addSubview:row01Square05]; 

    UIView* row01Square06 = [[UIView alloc] initWithFrame:CGRectMake((5*x), (0*y), x, y)]; 
    [self addSubview:row01Square06]; 

    UIView* row01Square07 = [[UIView alloc] initWithFrame:CGRectMake((6*x), (0*y), x, y)]; 
    [self addSubview:row01Square07]; 

    UIView* row01Square08 = [[UIView alloc] initWithFrame:CGRectMake((7*x), (0*y), x, y)]; 
    [self addSubview:row01Square08]; 
} 

return self; 

}

est-il possible d'écrire une méthode qui pourrait utiliser ce code (avec des modifications de bien sûr) pour générer les 7 rangées suivantes d'UIViews? Mieux encore, est-il possible d'utiliser 1 ligne pour générer toutes les 64 vues UI?

J'ai expérimenté avec une boucle for, while, do, mais j'avoue que je suis complètement perdu quand il s'agit de savoir si vous pouvez ou non passer une chaîne comme argument à une méthode init.

Merci d'avance pour tout renseignement à ce sujet.

+0

Gardez à l'esprit que vous aurez également besoin de libérer les UIViews après les ajouter. –

Répondre

2

Voulez-vous dire:

for (int i=0;i<8;i++) { 
    UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (0*y), x, y)]; 
    [self addSubview:square]; 
    } 

Ou (pour toutes les lignes):

for(int r=0;r<8;r++) { 
    for (int i=0;i<8;i++) { 
     UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (r*y), x, y)]; 
     [self addSubview:square]; 
     } 
    } 
+0

Ok, cette partie a du sens. La partie qui me trouble est comment puis-je accéder à l'un des UIViews individuels générés par ce code ailleurs. Mon instinct me dit que j'ajouterais une ligne setTag à la boucle, puis utiliser viewWithTag pour accéder à une instance particulière. – JP1971

+0

Eh bien, vous connaissez l'ordre dans lequel ils ont été créés, ils seront donc dans cet ordre dans self.subViews et vous pourrez en extraire un spécifique avec objectAtIndex, ou bien vous pouvez faire une boucle à la place. – Ben

+0

Essayer d'obtenir une vue spécifique en accédant à selfsubviews par index est fragile. Il est préférable d'ajouter une balise à chaque vue et d'y accéder par balise, ou de stocker des références à vos sous-vues dans une variable de membre de tableau. L'utilisation de balises est probablement la meilleure approche si vous n'avez pas besoin d'accéder aux vues après qu'elles ont été supprimées de leur vue d'ensemble. – Ryan

1
int numberOfRows = 8; 
int numberOfColumns = 8; 

for (int j = 0; j<numberOfRows;j++){ 
    for (int i=0;i<numberOfColumns;i++) { 
     UIView* square = [[UIView alloc] initWithFrame:CGRectMake((i*x), (j*y), x, y)]; 
     [self addSubview:square]; 
    } 
}