2010-11-10 5 views
0

Cela me rend fou. Très reconnaissant si quelqu'un pouvait m'aider!Référence CustomView de mon contrôleur

Problème: Je NSView sous-classé (et mis en œuvre initWithRect: et drawRect:) et relié à un CustomView dans IB. Ensuite, dans mon Controller.h j'essaye de créer une référence à cette instance en utilisant Viewer *view; (Viewer est ma sous-classe de NSView). Cependant, quand j'essaie d'atteindre une fonction fictive qui n'effectue que printf("something") rien ne se passe. Comme je n'ai pas alloué de mémoire pour cette instance [view retainCount] donne 0. J'ai cru comprendre que IB instancierait cette classe pour moi. La raison pour laquelle je veux pouvoir référencer l'instance est que je peux appeler [view setNeedsDisplay: YES] pour que la vue soit redessinée. J'ai connecté mon CustomView avec la prise de vue dans IB et enregistré.

#import "Viewer.h" 
#import "Controller.h" 


@implementation Viewer 

- (id)initWithFrame:(NSRect)frameRect 
{ 
    self = [super initWithFrame:frameRect]; 
    return self; 
} 

-(void)awakeFromNib 
{ 
    printf("awake!\n"); //works! 
} 

- (void)drawRect:(NSRect)rect 
{ 
    CGContextRef myContext = [[NSGraphicsContext currentContext]graphicsPort]; 
    for (int i=0; i<8; i++) { 
     for (int j=0; j<8; j++) { 
      printf("%f\n",gPopulation[i][j]/2); 
      CGContextSetRGBFillColor (myContext, gPopulation[i][j]/2, 0.3, 0.1, 1); // Set color 
      CGContextFillRect (myContext, CGRectMake (i*50, j*50, 50, 50)); 
     } 
    } 
} 


**- (void) redraw { //dummy function that I can't reach from controller with [view redraw]. Gives no error, but retainCount = 0** 
    printf("redraw------\n"); 
    //[self display]; 
} 

@end 

#import <Cocoa/Cocoa.h> 
#import "Viewer.h" 

double gPopulation[8][8]; 

@interface Controller : NSObject { 
    NSMutableArray *emptySpots; 
    int nEmpty, nWhite, nBlack; 
    NSOperationQueue *queue; 
    IBOutlet Viewer *view; 
} 
- (void) main; 
- (id) initWithMain; 
- (void) updatePopulation; 
- (void) initPopulation; 
@end 

Répondre

0

Les étapes que vous décrivez ne sont pas tout à fait clair, mais voici plusieurs choses qui se démarquent:

1 - Ce n'est pas votre lieu de demander un objet pour son -retainCount afin de déterminer si elle est utilisée ou pas. Vous n'avez aucun moyen de savoir (et vous n'êtes pas supposé savoir ou dépend de savoir) quoi d'autre pourrait avoir un intérêt dans cet objet.

2 - Vous recherchez un objet valide en vérifiant si le pointeur d'objet ("view" dans votre cas) est valide (pointe vers un objet) ou est nul. - Lors de la création d'une sous-classe NSView personnalisée et de l'instanciation d'une copie dans votre fichier nib/xib, vous devez faire glisser une instance NSView de la bibliothèque, puis définir son nom de classe sur celui de votre sous-classe. créer une instance de NSView. Je ne pense pas que ce soit votre problème (voir # 4) mais vous n'avez pas dit cela, donc c'est une autre chose à vérifier. 4 - Lorsque vous envoyez un message à zéro, rien n'est exactement ce qui est censé se produire, il est donc probable que votre pointeur/prise de vue soit nul.

5 - Il est facile de confondre «une instance que j'ai créée et référencée dans une plume/xib» avec «une instance créée à l'exécution». Cela arrive souvent avec ceux qui découvrent Cocoa. Êtes-vous absolument certain que l'instance de l'objet qui détient la connexion (nommée "view") est la même que l'instance que vous examinez au moment de l'exécution? Par exemple, vous créez une classe de contrôleur nommée MyController, instanciée dans votre nib/xib (sous forme de cube bleu), câblée, etc. Ensuite, lors de l'exécution, instanciez un nouveau MyController ([[MyController alloc] init] .. .) et essayé d'accéder à son (nil) point de vue "view", qui ne pointe à rien car ce n'est pas la même instance que celle de votre nib/xib.

+0

Merci pour votre réponse, – salomons

+0

Mise à jour avec plus de pensées. –

+0

1. Ok 2. Essayé if (view == nul) { printf ("isNil"); } Et en fait c'est nul. Étrange depuis que j'ai connecté le CustomView (que j'ai changé pour ne pas être NSView mais Viewer [ma sous-classe]) avec la vue de sortie dans ma classe de contrôleur. Est-ce que ça devrait être vraiment nul? 3. J'ai fait glisser une copie de CustomView dans ma fenêtre. Cela doit être la même chose, non? – salomons

Questions connexes