2009-07-19 8 views
3

J'essaie de me concentrer sur Objective-C pour l'iPhone. Mon application compile et fonctionne très bien jusqu'à présent, mais je reçois un avertissement du compilateur dont je ne peux pas me débarrasser.Avertissement du compilateur XCode: 'foo' peut ne pas répondre à -bar

tête pour une classe: (snipped)

@interface PersonDetailViewController : UIViewController { 
    NSDictionary *person; 
} 
@property (retain) NSDictionary *person; 
@end 

mise en œuvre de cette classe: (aussi snipped)

#import "PersonDetailViewController.h" 
@implementation PersonDetailViewController 
@synthesize person; 
@end 

Je crée une instance de PersonDetailViewController dans PersonListViewController et appelant:

#import "PersonListViewController.h" 
#import "Person.h" 
#import "PersonDetailViewController.h" 

@implementation PersonListViewController 
- (IBAction)myMethod:(id)sender { 
    NSDictionary *person = [[Person alloc] initFromTestArray:[sender tag]]; 
    [personDetailViewController setPerson:person]; 
    [[personDetailViewController person] describe]; 
} 
@end 

Et je suis alors informé que:

warning: 'UIViewController' may not respond to '-setPerson' (Messages without a matching method signature will be assumed to return 'id' and accept '...' as arguments.) 
warning: 'UIViewController' may not respond to '-person' 

il ne répond en fait très bien, mais je ne peux pas comprendre comment organiser mes en-têtes afin que le compilateur sache ce qui répondra ...

Je suis tout de Google ... espoir J'ai donné assez d'informations et quelqu'un peut aider.

Merci beaucoup!

Répondre

4

Apparemment, vous avez personDetailViewController déclaré UIViewController? Vous pouvez lancer le contrôleur explicitement:

[(PersonDetailViewController*)personDetailViewController setPerson:person]; 

Mais garçon c'est moche. Il vaudrait mieux déclarer simplement personDetailViewController comme PersonDetailViewController dans l'en-tête PersonListViewController. J'espère avoir bien compris, je suis un peu hébété par tous les noms longs :)

+0

Aha! Oui. Je jetais personDetailViewController en tant que UIViewController générique, donc le compilateur ne savait pas chercher les méthodes setter et getter synthétisées! En ce qui concerne le premier point de micmoo, c'était moi être stupide et aveugle. Tout semble beaucoup plus propre maintenant et construit sans erreurs! Merci beaucoup! – sinissaar

2

Je suis un peu confus ... Pourquoi voudriez-vous faire:

NSDictionary *person = [[Person alloc] initFromTestArray:[sender tag]]; 

Votre déclarant être un NSDictionary, mais sont une classe de s'être initialisé personne ... devrait-il pas ce soit

Person *person = [[Person alloc] initFromTestArray:[sender tag]]; 

modifier Je n'ai pas remarqué la @property & synthétisent, vous aviez raison là, mon mauvais ... l'accepter réponse est ce que vous étiez lo En cherchant!

+2

Je suis d'accord avec le premier point, mais 'person' est une propriété qu'il déclare dans l'en-tête et synthétise dans l'implémentation. –

+0

Ahhhh bon point. J'ai oublié le @synthesize ... je vais éditer mon post. – micmoo

Questions connexes