2012-01-13 5 views
8

Sto facendo un'app per iPhone e sto lavorando a questo TableViewController, ma durante il test, ottengo questo errore e non lo faccio So davvero cosa farsene:App iOS (questa classe non è un valore chiave compatibile con la codifica per la chiave dataSource)

2012-01-13 13:45:32.947 HandHistory Reviews[3422:707] *** 
Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<SessionsTableViewController 0x191cb0> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key dataSource.' 

Qualcuno ha un'idea?

Questo è il mio file SessionTableViewController.m:

#import "SessionsTableViewController.h" 
#import "Session.h" 

@interface SessionsTableViewController() 

@property (nonatomic, copy) NSArray *sessions; 

@end 

@implementation SessionsTableViewController 

@synthesize sessions = _sessions; 

#pragma mark - View lifecycle 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSMutableArray *sessions = [[NSMutableArray alloc] init]; 

    // Looking for files 
    // Finding the Documents directory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [paths objectAtIndex:0]; 
    NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; 

    // Looping through each file in the directory 
    for (NSString *file in directoryContent) 
    { 
     NSString *contents = [NSString stringWithContentsOfFile:[[paths objectAtIndex:0] stringByAppendingPathComponent:file] encoding:NSUTF8StringEncoding error:nil]; 

     Session *session = [[Session alloc] initWithName:file andContents:contents]; 

     [sessions addObject:session]; 
    } 

    self.sessions = sessions; 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.sessions count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Session Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    //cell.textLabel.text = [[self.sessions objectAtIndex:indexPath.row] name]; 
    //cell.detailTextLabel.text = [[NSString alloc] initWithFormat:@"%d hands", 10]; 

    return cell; 
} 



#pragma mark - Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Navigation logic may go here. Create and push another view controller. 
    /* 
    <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; 
    // ... 
    // Pass the selected object to the new view controller. 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    */ 
} 

@end 
+0

check-out NSLog la prima sessione di – Hiren

risposta

16

Sembra che tu hai cablata cose nel costruttore di interfaccia in modo non corretto. Sembra che tu abbia collegato qualcosa a una presa chiamata dataSource nel tuo SessionsTableViewController. Sembra che probabilmente hai voluto farlo al contrario, presumo che tu abbia una vista tabella in SessionsTableViewController.

Quindi, è necessario collegare la proprietà dataSource della visualizzazione tabella all'istanza di SessionsTableViewController (probabilmente "Proprietario file" nel proprio caso), piuttosto che il contrario.

+0

vedo, ho impostato il mio SessionsTableViewController come classe personalizzata per la mia TableView invece del mio TableViewController, grazie, questo è quello che cercavo , tutto funziona ora. –

0

Verificare di non aver specificato l'app errata nella casella denominata Modulo (solo in Classe). Questo è in Identity Inspector in UI Builder.

In genere non è necessario specificare nulla come Modulo, poiché è impostato per impostazione predefinita su una voce in grigio con l'etichetta "corrente ....", il che significa che è disponibile in tutte le app. Tuttavia, se hai specificato un'app qui, l'elemento dell'interfaccia utente non sarà disponibile per altre app nel progetto, fornendo il messaggio di errore soggetto quando tenti di eseguire altre app.

Quello era il mio problema ...

+0

Se questo commento risponde alla domanda, non è immediatamente chiaro come. Considera la riformulazione? –

+1

Non so in che altro modo posso ripeterlo. Se nel modulo è specificato qualcosa, si otterrà l'errore specificato dall'OP quando si tenta di creare un altro modulo. –