2012-01-13 14 views
8

Estoy haciendo una aplicación para iPhone, y estoy trabajando en este TableViewController, pero al probar, me sale este error, y no lo hago t realmente sabe qué hacer con él:iOS aplicación (esta clase no es clave de codificación de valor para la fuente de datos clave)

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.' 

¿Alguien tiene una idea?

Este es mi archivo 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

la salida NSLog la primera sesión – Hiren

Respuesta

16

Parece que usted ha atado con alambre las cosas en constructor de interfaces de forma incorrecta. Parece que ha adjuntado algo a una toma de corriente llamada dataSource en su SessionsTableViewController. Parece que probablemente quisiste hacerlo al revés, ya que supongo que tienes una vista de tabla en SessionsTableViewController.

Por lo tanto, debe adjuntar la propiedad dataSource de su vista de tabla a su instancia de SessionsTableViewController (probablemente "Propietario del archivo" en su caso), y no al revés.

+0

veo, he configurado mi SessionsTableViewController como clase personalizada para mi TableView en lugar de mi TableViewController, gracias, esto es lo que estaba buscando , todo funciona ahora –

0

Comprueba que no hayas especificado la aplicación incorrecta en el cuadro denominado Módulo (justo debajo de Clase). Esto está en el Inspector de identidad en el Creador de UI.

Normalmente, no debería tener nada especificado como Módulo, ya que está predeterminado en una entrada atenuada con la etiqueta "actual ...", lo que significa que está disponible en todas las aplicaciones. Pero, si ha especificado una aplicación aquí, el elemento de la interfaz de usuario no estará disponible para ninguna otra aplicación en su proyecto, lo que le proporcionará el mensaje de error del sujeto cuando intente ejecutar otras aplicaciones.

Ese era mi problema ...

+0

Si este comentario responde la pregunta, no está claro de inmediato cómo. Considera volver a redactar? –

+1

No sé de qué otra manera puedo reformularlo. Si tiene algo especificado en el Módulo, recibirá el error que el OP especificó cuando intenta construir otro módulo. –

Cuestiones relacionadas