2010-12-05 7 views
2

J'ai:Passant Array de contrôleur pour afficher

  1. UIView
  2. UIViewController

Dans le UIViewController je dois être en mesure d'insérer des éléments dans un tableau fixe de 6 entiers. Ensuite, j'ai besoin de passer ce tableau à la vue afin qu'il analyse le tableau et mettre à jour l'écran de manière appropriée. Comment vais-je faire cela? J'ai essayé d'utiliser des tableaux C standard, mais cela ne semble pas fonctionner?

+0

Pourquoi cette note est-elle abaissée? –

Répondre

2

Vous ne pouvez pas utiliser C arrays comme arguments pour les méthodes, ni les transmettre à quelque chose. Vous avez deux options:

  1. Utilisez un NSArray de six NSNumbers, chacun contenant un int.
  2. Utilisez un pointeur sur le tableau C.

Lequel vous choisissez est à vous. L'option 1 est plus semblable à l'iPhone. L'option 2 consomme moins de mémoire.

+0

Convenu. Option 1 utilise plus de mémoire, mais c'est une façon rapide et sale de faire les choses. – Richard

1

Parce que c objectif ne permet pas de tableaux C à passer à des méthodes objectives c, à moins qu'ils ne soient envoyés sous forme de pointeurs, Voici une méthode:

// MyViewController.m 
#define BOX_INT(ARG_1) [NSNumber numberWithInt:ARG_1]; 

.... 

-(void) somethingHappened:(id) sender 
{ 
    // initialize the array: 
    NSArray *array = [NSArray arrayWithObjects:BOX_INT(ints[0]), BOX_INT(ints[1]), BOX_INT(ints[2]), BOX_INT(ints[3]), BOX_INT(ints[4]), BOX_INT(ints[5]), nil]; 
    [myView passArray:array]; 
} 


// MyView.m 
#define UNBOX_INT(ARG_1) [ARG_1 intValue]; 

.... 

-(void) passArray:(NSArray *) array 
{ 
    int intArray[6]; 

    for (int i = 0; i < 6; i++) 
    { 
      intArray[i] = UNBOX_INT([array objectAtIndex:i]); 
    } 

    ... 
} 

Ou, vous pouvez simplement passer un pointeur (non recommandé

// MyController.m 

-(void) somethingHappened:(id) sender 
{ 
    [myView passArray:ints]; 
} 

-(void) passArray:(int *) array 
{ 
    // think of array as an integer array, with a length of 6. 
} 
+0

Puis-je demander ce que '#define UNBOX_INT (ARG_1) [ARG_1 intValue];' – confused

+0

il définit une macro qui est équivalente à la fonction: 'int UNBOX_INT (NSNumber * num) {return [num intValue]; } ' –

+0

Est-il possible de déclarer ce tableau dans le fichier d'en-tête, puis d'accéder dans le fichier .m à des éléments individuels à mettre à jour? c'est-à-dire myArray [5] = 356; – confused

0

Il ya toujours eu une discussion sur la façon de partager des objets entre deux classes. Donc, généralement parlant, il existe trois méthodes: -

  1. Singleton Objets
  2. variables globales
  3. les variables Appdelegate

Cependant, si tu veux vraiment passer un tableau de ViewController pour voir, je recommande d'aller avec la 3ème méthode, c'est-à-dire AppDelegate Variables. Et oui c'est toujours souligné que c'est rapide mais Dirty méthode.

Donc, ce que vous pouvez faire est déclarer et Array dans Appdelegate.

maintenant pour insérer des éléments dans ce tableau dans ur viewcontroller

UrAppDelegate* delegate = (UrAppDelegate*)[[UIApplication sharedApplication]delegate]; 
[delegate.urArrayName addObject:@"someObject"]; 

Et puis quand tu veux l'utiliser dans ur vue .. juste aller de l'avant et d'utiliser la même méthode ci-dessus.