2 votes

Comment passer un NSMutableArray à une autre classe ViewController

J'ai créé un tableau NSMutale dans "HeroListViewController" . Je veux l'utiliser dans un autre viewController qui est MapTutorialViewController . J'ai essayé de la manière suivante.

dans HeroListViewController.h

MapTutorialViewController *maptutorialcontroller;
NSMutableArray *listData; 

définir les propriétés et les synthétiser correctement

dans HeroListViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    listData = [[NSMutableArray alloc] init];   
    }

 - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *HeroTableViewCell = @"HeroTableViewCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:HeroTableViewCell];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:HeroTableViewCell] autorelease];
}
NSManagedObject *oneHero = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSInteger tab = [tabBar.items indexOfObject:tabBar.selectedItem];
switch (tab) {
    case kByName:
        cell.textLabel.text = [oneHero valueForKey:@"name"];
        cell.detailTextLabel.text = [oneHero valueForKey:@"secretIdentity"];
        break;
    case kBySecretIdentity:
        cell.detailTextLabel.text = [oneHero valueForKey:@"name"];
        cell.textLabel.text = [oneHero valueForKey:@"secretIdentity"];
    default:
        break;
}

        [listData addObject: [oneHero valueForKey:@"secretIdentity"]];

        count=[listData count];
                printf("No of items of listData:%u\n", count);

if(maptutorialcontroller==nil){
      maptutorialcontroller= [[MapTutorialViewController    alloc]initWithNibName:@"MapTutorialViewController" bundle:nil];
maptutorialcontroller.secondarray=listData;
}
count=[maptutorialcontroller.secondarray count];
printf("No of items of seconarray :%u\n", count);

return cell;

}

SORTIES : Nombre d'éléments de listData : Nombre d'éléments de seconarray :3 // les deux sont corrects

MAIS le problème que j'ai, c'est quand j'essaie d'utiliser le secondarray dans "MapTutorialViewController" comme ceci, dans MapTutorialViewController.h

    HeroListViewController *heroviewcontroller;
  NSMutableArray *secondarray; 

définir les propriétés et les synthétiser correctement

dans MapTutorialViewController.m

 - (void)viewDidLoad 
   {
    heroviewcontroller = [[HeroListViewController alloc]initWithNibName:@"HeroListViewController"  bundle:nil]; 
   self.secondarray=[heroviewcontroller.listData mutableCopy];
   //secondarray= heroviewcontroller.listData;
int count;
count = [secondarray count];
//  
   printf("No of items of secondarray from MapTutorialViewContriller :%u\n", count);
   }

OUTPUT : No of items of secondarray from MapTutorialViewContriller :0
Pourquoi c'est 0

Quel est le problème avec mon code, s'il vous plaît aidez-moi

2voto

Exemple

firstviewcontroller .h file

        before @interface 

        use @class secondViewcontroller;

declare this inside of @interface  with

        secondViewcontroller *sVC;

then in firstViewController.m file 

        before @implementation          

    #import "secondViewcontroller.h"

then
-------------------

secondVC.h file

        @interface inside declare this

        say NSMutableArray *secondarray;

        and sythasize them.

------------------- 

after this 

        in firstViewcontroller.h viewdidload create this sVC by alloc and initwithnibname then

        sVC.secondArray=urfirstArray;

        now while u push this sVC controller to navigation controller u can nslog this array in viewdidload.

1voto

dasdom Points 6905

Cela ne fonctionnera que si vous créez et remplissez le tableau mutable dans la méthode init.

Vous devriez vous pencher sur la délégation et/ou la notification.

0voto

DexterW Points 2687

Comment ce tableau est-il créé dans le HeroListViewController ? Dans cette méthode, vous créez une NOUVELLE instance de HeroListViewController et vous essayez d'en obtenir une propriété. Si vous avez déjà un HeroListViewController en mémoire, c'est complètement faux.

Créez une propriété sur la classe pour cette méthode viewDidLoad. Elle doit être de type NSMutableArray. Lorsque vous allouez et initialisez cette classe, appelez [set myArray:heroListArray] sur elle depuis HeroListViewController. Cela devrait vous permettre d'y accéder.

0voto

XenElement Points 5865

Je suppose que vous avez une vue contenant cette nouvelle vue et la vue de la liste des héros. Si c'est le cas, vous pouvez créer une propriété dans la nouvelle vue comme suit :

@property (nonatomic,retain)HeroListViewController *heroListViewController;

et de la mettre à égalité avec la liste des héros de l'extérieur :

newView.heroListViewController = HeroListViewController;

Le principal problème de votre code est que vous créez une nouvelle instance de HeroListViewController en utilisant alloc init, et que vous n'accédez pas à la même chose. En définissant la propriété heroListViewController de la nouvelle vue, vous pouvez accéder au bon viewController.

Enfin, dans viewDidLoad de la nouvelle vue - je mettrais en fait le code dans viewWillAppear :(BOOL)Animated - vous pouvez mettre du code pour faire correspondre les tableaux.

Notez que cette façon de faire est désordonnée et qu'il serait préférable d'utiliser une classe singleton si vous avez besoin d'accéder à un tableau à plusieurs endroits. Ce qui précède vous aidera à faire fonctionner le système rapidement, mais si vous voulez une solution vraiment propre, allez ici : http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/24135-singleton-classes.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X