UITableView no actualiza

Estoy usando un model de Core Data y una vista de tabla UITableViewController. Mi model parece funcionar bastante bien, pero mi vista de tabla no se actualiza cuando agrego una entidad a mi model. La razón por la que creo que mi model está funcionando es porque cuando agrego una entidad no aparece nada en la vista durante el time de ejecución; sin embargo, si corté la tarea y la puse en marcha de nuevo, de repente la entidad que creé anteriormente aparece en la vista de la tabla.

Aquí está mi controller de vista de tabla: AudioTableViewController.h

#import <UIKit/UIKit.h> #import "Bank.h" #import "Player.h" @class Player; @interface AudioTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> { Player *myMainMan; } -(void)addAudioEntityToArray:(AudioFile *)event; -(NSMutableArray *)recordingsArray; @end 

AudioTableViewController.m (file de implementación)

 #import "AudioTableViewController.h" @implementation AudioTableViewController -(void)addAudioEntityToArray:(AudioFile *)event { NSIndexPath *indexPath; if(event.type) { [[MusikerViewController recordingsArray] addObject:event];//self? indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; }else { [[MusikerViewController downloadsArray] addObject:event]; indexPath = [NSIndexPath indexPathForRow:0 inSection:1]; } [[self tableView] setEditing:YES animated:NO]; [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; } - (void)viewDidLoad { [[self tableView] reloadData]; [super viewDidLoad]; self.title = @"Audio Files";//put this in application delegate self.navigationItem.leftBarButtonItem = self.editButtonItem; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 2; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. NSLog(@"Place I"); if(section == 0) { return [[MusikerViewController recordingsArray] count]; } else if (section == 1) { return [[MusikerViewController downloadsArray] count]; } } 

… más methods

Aquí hay una parte de mi class de banco que podría ser relevante para Bank.h

 #import <Foundation/Foundation.h> #import <AudioToolbox/AudioToolbox.h> #import "AudioFile.h" #import "AudioTableViewController.h" #import "MusikerAppDelegate.h" @interface Bank : NSObject <UIAlertViewDelegate> { NSManagedObjectContext *managedObjectContext; AudioFile *sound; } @property (retain, nonatomic) NSManagedObjectContext *managedObjectContext; +(NSString *)getDataPath:(NSString *)fileExtDate; -(AudioFile *)addAudioFileEntityToModelWithDate:(NSDate *)theD andURLString:(NSString *)str; -(BOOL)removeAudioFromModel:(id)audio; -(NSMutableArray *)getFetchArray; @end 

Bank.m

 #import "Bank.h" @implementation Bank @synthesize managedObjectContext; - (AudioFile *)addAudioFileEntityToModelWithDate:(NSDate *)theD andURLString:(NSString *)str { sound = (AudioFile *)[NSEntityDescription insertNewObjectForEntityForName:@"AudioFile" inManagedObjectContext:managedObjectContext]; sound.creationDate = theD; sound.soundPath = str; //set the sound path to the sound file's url [self alertForTitle]; return sound; } - (BOOL)saveContext { NSError *error = nil; if(!managedObjectContext) { NSLog(@"managedObejctContext problem at saveContext Bank"); } if (![managedObjectContext save:&error]) { return NO; } else { return YES; } } - (NSMutableArray *)getFetchArray { NSLog(@"ManagedObjectContext at getFetchArray"); NSLog(@"Context: %@",managedObjectContext); NSFetchRequest *request = [[NSFetchRequest alloc] init]; if(!managedObjectContext) { NSLog(@"There is no managedObjectContext in getFetchArray Bank"); } NSEntityDescription *entity = [NSEntityDescription entityForName:@"AudioFile" inManagedObjectContext:managedObjectContext]; [request setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [request setSortDescriptors:sortDescriptors]; [sortDescriptors release]; [sortDescriptor release]; NSError *error = nil; NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; if (mutableFetchResults == nil) { NSLog(@"mutableFetchResults array is nil"); } [request release]; return mutableFetchResults; } + (NSString *)getDataPath:(NSString *)fileExtDate { NSLog(@"getDataPath called"); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; documentsDirectory = [documentsDirectory stringByAppendingPathComponent:@"Musik Directory"]; //changing the recording directory to Musik Directory NSError *error; if (![[NSFileManager defaultManager] fileExistsAtPath:documentsDirectory]) { [[NSFileManager defaultManager] createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:&error]; NSLog(@"In the if statement"); } NSString *docPath = [documentsDirectory stringByAppendingPathComponent:fileExtDate]; return docPath; } 

Player.h

 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> #import "Bank.h" @class Bank; @interface Player : NSObject <AVAudioPlayerDelegate, AVAudioRecorderDelegate> { Bank *daBank; AVAudioPlayer *musicPlayer; AVAudioRecorder *musicRecorder; NSDate *myDate; NSString *strPath; NSString *documentPath_; NSMutableArray *arrayListOfRecordSound; } -(void)playSoundFile:(NSString *)soundFilePath; -(BOOL)saveRecordingWithDate:(NSDate *)theD andURLString:(NSString *)str; -(void)recordSomething; -(void)playRecording; -(void)play; + (NSString *)dateString:(NSDate *)date; + (NSString *)dateString; @end 

Player.m

 - (Bank *)daBank { if(!daBank) { daBank = [[Bank alloc] init]; } return daBank; } -(BOOL)saveRecording { //this is the method that adds the new object to both the //model and view, the method that calls this method is not shown Bank *B = [MusikerViewController daBank]; AudioTableViewController *ATVC2 = [MusikerViewController ATVControl]; AudioFile *myAudioFileMusicX314 = [[B addAudioFileEntityToModelWithDate:myDate andURLString:strPath] retain]; myAudioFileMusicX314.type = true; [ATVC2 addAudioEntityToArray:myAudioFileMusicX314]; if(![B saveContext]) { NSLog(@"addAudioFileEntityToModel is returning a nil managedObjectContext"); return NO; } [myDate release]; [strPath release]; [myAudioFileMusicX314 release]; [ATVC2 release]; return YES; } 

Por último, pero no less importante, MusikViewController.h

 #import <UIKit/UIKit.h> #import "Player.h" #import "Bank.h" #import <QuartzCore/QuartzCore.h> #import "MyButtonView.h" #import "AudioTableViewController.h" @class AudioTableViewController; @class Bank; @class Player; @interface MusikerViewController : UIViewController { ] BOOL *pressed; } Player *myMainMan; Bank *daBank; AudioTableViewController *ATVControl; NSMutableArray *recordingsArray; NSMutableArray *downloadsArray; + (Bank *)daBank; + (Player *)myMainMan; + (AudioTableViewController *)ATVControl; + (NSMutableArray *)recordingsArray; + (NSMutableArray *)downloadsArray; @end 

MusikViewController.m

 + (NSMutableArray *)recordingsArray { NSLog(@"recordingsArray called"); if(!recordingsArray) { recordingsArray = [[NSMutableArray alloc] init]; NSMutableArray *bigTempArray = [[[[Bank alloc] init] autorelease] getFetchArray]; //change this for(AudioFile *af in bigTempArray) if(af.type) { [recordingsArray addObject:af]; } NSLog(@"recordingsArray exists"); } return recordingsArray; } + (NSMutableArray *)downloadsArray { NSLog(@"recordingsArray called"); if(!downloadsArray) { downloadsArray = [[NSMutableArray alloc] init]; // if(!bigTempArray) NSMutableArray *bigTempArray = [[[[Bank alloc] init] autorelease] getFetchArray]; for(AudioFile *af in bigTempArray) if(!af.type) { [downloadsArray addObject:af]; } } return downloadsArray; } 

Si hay más methods que puedan ser relevantes, avíseme y los publicaré felizmente.

También debo mencionar que puedo agregar una sola entidad a la matriz después de iniciar la aplicación, pero después de eso es el mismo problema.

Creo que su problema es la architecture de sus controlleres de vista. Prueba esto:

1) Configura toda la stack de datos centrales en el delegado de la aplicación. Pase el context de object gestionado asociado a todos sus controlleres de vista como propiedad. Ese es el patrón que Apple usa en muchos de sus ejemplos de ejemplos de códigos.

2) Para cada controller de vista de tabla, cree su propio NSFetchedResultsController , normalmente también como una propiedad. Use las muestras de Apple como guía.

3) Nunca obtenga datos de otro controller de vista, como lo hace en su código. No puede y no debe get los datos de la tabla para AudioTableViewController desde MusikerViewController .

A veces es útil tener un object de datos central que proporcione datos para ver los controlleres. No puede tener este object de datos como un controller de vista. Esta es una violación flagrante (y en su caso fatal) del patrón de layout de MVC. Lo más probable es que su error se MusikerViewController que ( MusikerViewController no está en la pantalla e incluso puede ser desasignado).

4) Asegúrese de que en sus methods de datasource utilice solo el controller de resultados obtenido para completar las tablas y entregar medios.

Puede ser su – (void) addAudioEntityToArray: (AudioFile *) evento {} método se llama desde el subprocess secundario (que no sea el subprocess MainUi) para que la tabla de recarga directa no funcione.

intente en su lugar

 [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 

¡¡Espero eso ayude!!

Agregue [self.tableView reloadData] en el método addAudioEntityToArray al final. Esto obligará a UITableView a volver a cargar desde el model después de cada inserción.

Estás configurando eventsArray a través de setter:

 [self setEventsArray:[daBank getFetchArray]]; 

¿Por qué no accedes a través de Getter? Puede estar usando otra instancia de array

self.eventsArray o [self eventsArray]

Sugiero usar un controller fetchresults, utilicé matrices antes, pero mucho mejor con FRC.

En su método addAudioEntityToArray , su llamada a addObject agregará el nuevo evento al FIN del arreglo, no al principio.

Por lo tanto, indexPath que debe enviar a insertRowsAtIndexPaths es: como [NSIndexPath indexPathForRow:[MusikerViewController recordingsArray].count-1 inSection:0]