2010-11-23 21 views
0

J'ai ce code pour créer un tableau d'images à afficher sur une vue. La plupart des pages dans ma vue auront 20 images (dans des colonnes de 5, rangées de 4), mais j'ai réellement 43 images et quand mon tableau d'images contient le final 3, j'obtiens une exception quand sur la 4ème itération de l'intérieur loop, le tableau est vide.Exception hors limites sur NSArray thats vide

- (void)displayImages:(NSMutableArray *)images { 

NSMutableArray *keysArray = [[NSMutableArray alloc] initWithCapacity:5]; 

for (int column = 0; column < 5; column++){ 
    [keysArray addObject:[NSMutableArray arrayWithCapacity:5]]; 
    for (int row = 0; row < 4; row++) { 
     [[keysArray objectAtIndex:column] addObject:[images objectAtIndex:0]]; 
     [images removeObjectAtIndex:0]; 
    } 
} 

.... 

Puis-je contourner ce problème?

Merci.

EDIT:

suite de ce code, est le code qui tire réellement l'image du tableau. Mais le même scénario se produit ... à la quatrième itération, il se bloque.

for (int column = 0; column < 5; column++) { 
    for (int row = 0; row < 4; row++){   
     UIButton *keyButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     keyButton.frame = CGRectMake(column*kKeyGap, row*kKeyGap, kKeySize, kKeySize); 

     [keyButton setImage:[[keysArray objectAtIndex:column] objectAtIndex:row] forState:UIControlStateNormal]; 
     [keyButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

     [self.view addSubview:keyButton]; 
    } 
} 
[keysArray release]; 

Je ne peux pas tester images à ce stade que le tableau est vidé déjà.

Répondre

0

Essayez d'utiliser le tableau réel tailles au lieu de constante valeurs dans vos expressions de texte en boucle for. Ainsi, plutôt que ceci:

for (int column = 0; column < 5; column++) 

faire ceci:

for (int column = 0; column < [keysArray count]; column++) 

Le code résultant pourrait ressembler à ceci:

for (int column = 0; column < [keysArray count]; column++) { 

    NSArray *rowArray = [keysArray objectAtIndex:column]; 

    for (int row = 0; row < [rowArray count]; row++) {   
     UIButton *keyButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     keyButton.frame = CGRectMake(column*kKeyGap, row*kKeyGap, kKeySize, kKeySize); 

     [keyButton setImage:[rowArray objectAtIndex:row] forState:UIControlStateNormal]; 
     [keyButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 

     [self.view addSubview:keyButton]; 
    } 
} 

Par ailleurs, les expressions de messages imbriqués peuvent être cool parfois, mais imbriquer les appels à objectAtIndex: n'est probablement jamais une bonne idée.

0

test, le nombre d'objet dans images

1

vérifier juste pour voir s'il y a des objets dans ce tableau avant d'essayer de faire quelque chose avec elle

- (void)displayImages:(NSMutableArray *)images { 

NSMutableArray *keysArray = [[NSMutableArray alloc] initWithCapacity:5]; 

for (int column = 0; column < 5; column++){ 
    [keysArray addObject:[NSMutableArray arrayWithCapacity:5]]; 
    for (int row = 0; row < 4; row++) { 
     //test to see if there's an object left in the inner array 
     if ([images count] > 0) { 
      [[keysArray objectAtIndex:column] addObject:[images objectAtIndex:0]]; 
      [images removeObjectAtIndex:0]; 
     } 
    } 
}