2009-12-27 18 views
0

A avoir un objet NSView, et il reçoit un message après que je pousse dans la barre menu le sous-menu Ouvrir. Il charge les données d'échange d'un fichier texte, et il devrait le rendre dans un CustomView. Ainsi, lePourquoi l'objet objectif-c ne rafraîchit pas mon après réception d'un message?

-(IBAction)loadExchangeData:(id)sender 

charge les données et stocker dans un NSMutableArray*, et après qu'elle devrait rendue par drawRect.

Mais! Dans la fonction drawRect les données avant chargées disparaissent, le NSMutableArray* sera de nouveau 0X0.

et une partie du code:

.h:

#import <Cocoa/Cocoa.h> 
@interface Chart : NSView 
{ 
    NSMutableArray * exchange; 
} 
- (IBAction)loadExchangeData:(id)sender; 
@end 

.m:

#import "Chart.h" 
@implementation Chart 
- (IBAction)loadExchangeData:(id)sender { 
    ... 
    exchange = [NSMutableArray array]; 
    [exchange addObject:...]; 
    ... 
    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    ... 
    id sth = [exchange objectAtIndex:i]; 
    ... 
} 
@end 
+0

Post le code de loadExchangeData: afin que nous puissions voir ce qui pourrait être la cause. – sbooth

+0

merci pour le code - avez-vous vérifié que vous n'utilisez pas 2 objets différents de Chart, ce genre de problème vient normalement si vous ajoutez des données à un objet et que vous essayez d'accéder aux données d'un autre objet. Vérifiez l'adresse de l'objet Chart lors de l'exécution de loadExchangeData et lorsque drawRect est exécuté. Vous pouvez conserver le point de freinage dans les deux fonctions et vérifier l'adresse de l'objet dans la pile d'appels. –

+0

J'ai vérifié, oui, c'est le problème. Ils ont une adresse différente. Comment cela peut-il arriver? –

Répondre

0

par votre explication, il ressemble à votre référence des objets différents, votre paramètre pour NSMutableArray qui est dans un objet et drarect fait référence à un objet différent.

Déboguez le code pour connaître l'adresse de l'objet qui contient le NSMutableArray, cela pourrait vous aider à affiner le problème.

Pour obtenir de l'aide, ajoutez une partie du code pour en savoir plus.

Mise à jour sur la base du code et des commentaires

Vous pourriez avoir un objet en pointe et celui créé dans le code, dans ce cas éviter la création d'objet dans le code et renvoie l'objet créé en pointe dans la prise en utilisant le code (IBOutlet).

+0

Une partie du code joint. –