2009-05-15 7 views
1

Contexte: Je suis un gars .NET qui n'a pas d'expérience en Objective-C/Cocoa, mais je travaille sur le livre d'Aaron Hillegass, "Cocoa Programming for Mac OS X "essayant de prendre les bases. (Grand livre jusqu'à présent, BTW!) Dans le but de compléter l'un des défis secondaires facultatifs, j'écris une application basée sur le document qui permet aux utilisateurs de dessiner des ovales dans des emplacements arbitraires.Question Obj-C de base: Méthodes d'appel sur un objet

J'ai deux classes, interfaces comme suit:

@interface OvalDrawDocument : NSDocument 
{ 
    IBOutlet OvalView* myOvalView; 
} 
@end 

@interface OvalView : NSView { 
    NSMutableArray *ovals; 
} 
@property (readwrite, assign) NSMutableArray *ovals; 
@end 

Dans la mise en œuvre de OvalDrawDocument je suis en train d'utiliser l'auto-généré accesseur pour ovals comme si la propriété:

// in OvalView.m 
@synthesize ovals; 

// in OvalDrawDocument.m 
[myOvalView setOvals:loadedOvals];    // setter? 
NSMutableArray *ovalsToSave = [myOvalView ovals]; // getter? 

Cependant , le compilateur m'avertit que les méthodes ne sont pas trouvées, et qu'elles ne fonctionnent pas non plus à l'exécution. Ils apparaissent dans Code Sense, mais je suppose que cela ne signifie vraiment rien (Je m'habitue toujours aux différences entre XCode/VS ici) Je suppose qu'il y a un concept d'Obj-C que je ne comprends pas ici, peut-être lié à le fait que myOvalView est aussi un IBOutlet, mais je suis assez perdu. Que devrais-je faire, et plus important encore, pourquoi?


Mise à jour: Je ne déclare OvalView.h en OvalDrawDocument.m. Cela a corrigé les avertissements de compilation. Cependant, l'enregistrement et le chargement ne semblent toujours pas fonctionner et je n'arrive pas à comprendre pourquoi.

Comme demandé, j'ai posté le code source complet en ligne pour la lecture: Browse ou Download (59KB zip).

+1

est le ovals @synthesize dans @implementation OvalView bloc? – stefanB

+0

Vous devriez publier tous les fichiers afin que nous puissions voir où le problème est. Très probablement, vous avez quelque chose au mauvais endroit, pas importé ou non déclaré, mais il est difficile de dire à partir de ce que vous avez posté. Les IBOutlets/IBActions n'ont aucun effet sur votre code, ils sont supprimés lorsque vous compilez. Xcode établit les bonnes connexions et s'en débarrasse. –

+1

Juste pour souligner, vous voudrez probablement conserver plutôt qu'affecter lorsqu'il s'agit d'objets et de propriétés. –

Répondre

5

L'avertissement: Importe l'en-tête OvalView dans le fichier d'implémentation OvalDrawDocumentation.

Les messages ne fonctionnent pas lors de l'exécution: Assurez-vous que vous avez bien connecté la prise dans IB.

Aussi, comme Martin Pilkington a dit dans son commentaire sur votre question, vous devriez probablement déclarer cette propriété avec retain, pas assign.

+0

Si les appels ne fonctionnent pas au moment de l'exécution, cela ne peut pas être le (seul) problème. – smorgan

+0

Bon point. Edité en conséquence. –

+0

L'importation de l'en-tête a corrigé les avertissements. La sortie est correctement connectée dans IB au meilleur de ma connaissance - je vais poster la source complète pour être sûr. –

1

Cela n'a rien à voir avec le keywrod IBOutlet, qui est simplement un mot-clé "helper" pour Interface Builder et qui est défini comme "nothing" au moment de la compilation. Vous avez importé les fichiers d'en-tête pertinents et fait un alloc/init sur myOvalView?

+0

Pourquoi feriez-vous alloc/init si la vue existe déjà dans la plume? –

+0

Il peut exister dans le fichier nib sans avoir été alloué et initialisé, vous cherchez [[zzz alloc] initWithNib: @ "nom nib ici"]; – tmadsen

+0

NSView n'a aucune méthode initWithNib:. –

0

Je pense que vous allez devoir montrer plus de code, puisque vous semblez avoir les bonnes choses là-bas, donc il vous manque quelque chose ailleurs. En outre, si vous allez déclarer comme propriété ovales, alors il serait logique d'utiliser la syntaxe de la propriété dans OvalDrawDocument:

// in OvalDrawDocument.m 
myOvalView.ovals = loadedOvals;    // setter 
NSMutableArray *ovalsToSave = myOvalView.ovals; // getter