2012-02-11 1 views
3

Je suis actuellement en train de développer dans xcode et je me demande comment accéder aux champs d'un objet qui se trouve à l'intérieur d'un autre objet (ex. Pour ma méthode cellForRowAtIndexPath, j'essaie d'accéder à un champ de ma classe de patients qui se trouve dans ma classe d'admission. J'ai un tableau [myList] qui contient des objets d'admission et dans les objets d'admission, j'ai des objets patients.Objectif-C: Accéder au champ Objet dans un objet

Voici le code où j'ai un problème, dans ma méthode de cellForRowAtIndexPath:

static NSString *CellIdentifier = @"SimpleCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    NSUInteger row = [indexPath row]; 
    cell.textLabel.text = [[admList objectAtIndex:row]admPatName]; 
    return cell; 
} 

Le problème est sur cette ligne ci-dessous:

cell.textLabel.text = [[myList objectAtIndex:row]??]; 

sur le ?? zone, je ne pouvais pas trouver la bonne référence au domaine.

Des suggestions?

Merci JR

+0

Pourriez-vous s'il vous plaît poster votre classe Patient du fichier .h? – dasblinkenlight

+0

Les objets Objective-C ne peuvent pas accéder directement aux champs appartenant à un autre objet. (Comme dans les membres publics C++). Au lieu de cela, vous devez envoyer un message à l'autre [otherObj getFoo], ou en tant que propriété otherObj.foo. – seand

Répondre

1

Comme ceci:

cell.textLabel.text = [[[myList objectAtIndex:row] patient] name]; 

Ou, si vous préférez, comme ceci:

Admission *admission = [myList objectAtIndex:row]; 
cell.textLabel.text = admission.patient.name; 

Je devine que le problème que vous aviez était que la syntaxe à point doesn Ne travaillez pas directement sur [myList objectAtIndex: row] car le compilateur ne sait pas quel type d'objet est. Vous pouvez généralement utiliser le point ou la syntaxe [...] de manière interchangeable en Objective-C, donc si la syntaxe par points ne fonctionne pas, essayez les crochets. Pour ce que ça vaut la peine, vous pouvez l'obtenir pour travailler avec la syntaxe à point par coulée de l'objet tableau, mais il est un peu en désordre avec tous les supports:

cell.textLabel.text = ((Admission *)[myList objectAtIndex:row]).patient.name; 
+0

La syntaxe à points doit fonctionner, sauf pour l'auto-complétion de code. –

+1

Je ne pense pas. Chaque fois que je l'ai essayé le compilateur s'est plaint avec un avertissement comme "propriété foo introuvable sur l'objet de type id" parce que les objets de tableau ont un type non spécifié. –

0

Si je comprends bien, vos classes ressemblent à ceci:

@interface Patient : NSObject { 
    NSString *name; 
} 

@property (nonatomic, copy) NSString *name; 

@end 


@interface Admission : NSObject { 
    Patient *patient; 
} 

@property (nonatomic, retain) Patient *patient; 

@end 

et vous avez un tableau (admList) d'objets Admission. Voici comment vous accéder au nom du patient qui est référencé par l'admission avec un indice i dans le tableau:

[[[admList objectAtIndex:i] patient] name] 

Autre possibilité:

Admission *admission = [admList objectAtIndex:i]; 
cell.textLabel.text = admission.patient.name; 

ou:

cell.textLabel.text = [admList objectAtIndex:i].patient.name; 

+0

Si vous essayez cette dernière, je pense que vous trouverez que cela ne fonctionne pas. –

+0

@NickLockwood: vous avez raison, il tourne le compilateur traite comme une erreur et non un avertissement comme je le pensais initialement. –

+0

Cela devrait fonctionner cependant: [[admList objectAtIndex: i] patient] .name –

Questions connexes