2010-04-29 5 views
0

Je n'ai juste commencé avec XCode (v3.2.2) et Interface Builder et se sont heurtées à un problème.NSTableView

Voici ce que je l'ai fait:

J'ai fait une classe d'être la source de données d'un NSTableView:

@interface TimeObjectsDS : NSControl { 
    IBOutlet NSTableView * idTableView; 
    NSMutableArray * timeObjects; 
} 
@property (assign) NSMutableArray * timeObjects; 
@property (assign) NSTableView * idTableView; 

- (id) init; 
- (void) dealloc; 

- (void) addTimeObject: (TimeObj *)timeObject;  

// NSTableViewDataSource Protocol functions 
- (int)numberOfRowsInTableView:(NSTableView *)tableView; 
- (id)tableView:(NSTableView *)tableView 
      objectValueForTableColumn:(NSTableColumn *)tableColumn row: 
      (int)row; 


@implementation TimeObjectsDS 

@synthesize timeObjects; 
@synthesize idTableView; 

-(id) init {   
    if (self = [super init]) { 
     self.timeObjects = [[NSMutableArray alloc] init]; 

     TimeObj *timeObject = [[TimeObj alloc] init]; 
     [timeObject setProjectId:11]; 
     [timeObject setDescription:@"Heja"]; 
     [timeObject setRegDate:@"20100331"]; 
     [timeObject setTimeSum:20.0]; 

     [timeObjects addObject:timeObject];  

     [timeObject release]; 

     [idTableView reloadData];   
    } 

    return self; 
} 

- (void) dealloc { 
    [idTableView release]; 
    [timeObjects release]; 
    [super dealloc];   
} 
// Functions 
- (void) addTimeObject: (TimeObj *)timeObject { 
    [self.timeObjects addObject:timeObject]; 

    [idTableView reloadData];  
} 

// NSTableViewDataSource Protocol functions 
- (int) numberOfRowsInTableView:(NSTableView *)tableView { 

    return [self.timeObjects count]; 
} 

- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { 

    return [[timeObjects objectAtIndex:row] description]; 
} 
@end 

J'ai alors lié mon NSTableView dans la vue à cette source de données comme ceci:

alt text http://www.og-entertainment.com/tmp/ib_datasource_bindings_big.png

J'ai également lié la vue NSTableView à la variable contrôleur idTableView dans Interface Builder vu plus haut

Dans la fonction init ajouter un élément au tableau mutable. Cela s'affiche correctement dans NSTableView lorsque j'exécute l'application. Cependant, quand j'ajouter un autre élément au tableau (de même type que celui init) et essaie d'appeler [idTableView reloadData] sur la vue rien qui se passe. En fait, le contrôleur idTableView est null. Lors de l'impression avec la variable NSLog (@ "idTableView:% @", idTableView) je reçois "idTableView: (null)"

Im runing d'idées comment résoudre ce problème. Des idées à ce que je pourrais faire pour réparer la liaison?

Répondre

1

Si votre prise tableview dans votre contrôleur est nul, alors vous n'êtes pas connecté dans Interface Builder. Votre capture d'écran ci-dessus montre une connexion à TimeObjectsDS, mais cela ne veut pas dire beaucoup - est que l'instance que vous appelez de reloadData? Il est possible que vous ayez plus d'une instance de cette classe, par exemple.

C'est juste une possibilité. Sans plus de code, il n'est pas possible d'en énumérer beaucoup plus.

Soit dit en passant, dans MVC, il est considéré comme une mauvaise chose pour connecter un objet modèle directement à une vue. Vous utilisez peut-être mal la terminologie.

+0

Un grand merci pour votre temps. J'ai ajouté le code d'implémentation et corrigé la terminologie. J'ai seulement une instance de TimeObjectDS et j'appelle reloadData de l'intérieur. –

+0

D'où appelez-vous votre méthode? (Ce n'est pas une fonction). Si elle est appelée avant awakeFromNib, alors la tableView sera toujours nulle. Il est plus normal de créer des propriétés de l'objet que de conserver, céder, mais votre code n'est pas mal en tant que tel. Vous êtes également inconsistant dans votre utilisation de soi. pour se référer aux propriétés, mais encore une fois, le code n'est pas faux, et beaucoup de gens font la même chose. –

+0

Encore merci beaucoup pour votre temps. J'ai appelé la méthode avant AwakeFromNib. –