Hallo allerseits,
ich versuche nun seit ein paar Tagen einen TableView in einem ViewController anzuzeigen. Die App soll eine TabBar besitzen und auf einem View zusätzlich noch eine NavigationBar. Im TableView soll es eine Möglichkeit geben Elemente zu löschen, dazu habe ich den BarButton UIBarButtonSystemItemEdit. Nach dem löschen wird das Element zwar aus CoreData gelöscht, jedoch der TableView wird nicht mehr aktualisiert.
So nun zu meinem Code:
AppDelegate:
Alles anzeigen
ResultViewController.h:
Alles anzeigen
ResultViewController.m:
Alles anzeigen
Das XIB-File wurde automatisch von XCode erstellt. Darin habe ich nur einen TableView platziert. Delegate und DataSource sind mit dem FileOwner verbunden. Das IBOutlet "outletTableView" ist ebenfalls mit dem TableView verbunden.
Nachdem gelöscht wurde, wird (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView (zweimal?) aufgerufen, mit korrektem Rückgabewert. Danach (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section (einmal), ebenfalls mit korrektem Rückgabewert. Aber irgendwie scheint es den TableView nicht zu interessieren, erst nach Neustart der App wird es korrekt angezeigt.
Kann mir einer Helfen, was ich falsch mache?
Vielen Dank schon im Voraus!
Gruß Raphael
ich versuche nun seit ein paar Tagen einen TableView in einem ViewController anzuzeigen. Die App soll eine TabBar besitzen und auf einem View zusätzlich noch eine NavigationBar. Im TableView soll es eine Möglichkeit geben Elemente zu löschen, dazu habe ich den BarButton UIBarButtonSystemItemEdit. Nach dem löschen wird das Element zwar aus CoreData gelöscht, jedoch der TableView wird nicht mehr aktualisiert.
So nun zu meinem Code:
AppDelegate:
Quellcode
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
- self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
- self.resultViewController = [[[ResultViewController alloc] initWithNibName:@"ResultViewController" bundle:nil] autorelease];
- self.tabBarController = [[[UITabBarController alloc] init] autorelease];
- navigationController = [[UINavigationController alloc] initWithRootViewController:self.resultViewController];
- self.tabBarController.viewControllers = [NSArray arrayWithObjects:self.firstViewController, navigationController, nil];
- self.window.rootViewController = self.tabBarController;
- self.resultViewController.managedObjectContext = self.managedObjectContext;
- [self.window makeKeyAndVisible];
- return YES;
- }
ResultViewController.h:
Quellcode
- @interface ResultViewController : UIViewController <NSFetchedResultsControllerDelegate, UITableViewDelegate, UITableViewDataSource>
- {
- NSManagedObjectContext *_context;
- IBOutlet UITableView *outletTableView;
- }
- @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
- @property (nonatomic, retain) NSFetchedResultsController * fetchedResultsController;
- @end
ResultViewController.m:
Quellcode
- #import "ResultViewController.h"
- @interface ResultViewController ()
- @end
- @implementation ResultViewController
- @synthesize managedObjectContext;
- @synthesize fetchedResultsController;
- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- {
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- self.title = NSLocalizedString(@"Ergebnisse", @"Ergebnisse");
- }
- return self;
- }
- - (void)turnOnEditing {
- [self.navigationItem.rightBarButtonItem release];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(turnOffEditing)];
- [outletTableView setEditing:YES animated:YES];
- }
- - (void)turnOffEditing {
- [self.navigationItem.rightBarButtonItem release];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(turnOnEditing)];
- [outletTableView setEditing:NO animated:YES];
- }
- - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
- if (editingStyle == UITableViewCellEditingStyleDelete) {
- NSManagedObjectContext *newcontext = [self.fetchedResultsController managedObjectContext];
- [newcontext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
- NSError *error;
- if (![newcontext save:&error]) {
- // Handle the error...
- }
- [outletTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
- }
- [tableView reloadData];
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(turnOnEditing)];
- NSError *error = nil;
- if (![[self fetchedResultsController] performFetch:&error]) {
- // Update to handle the error appropriately.
- NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
- exit(-1); // Fail
- }
- //Testdaten
- NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
- NSEntityDescription *entity = [self.fetchedResultsController.fetchRequest entity];
- MeassureData *aResult = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
- [aResult setValue:[NSDate date] forKey:@"timeStamp"];
- [aResult setValue:[NSString stringWithFormat:@"A Beschreibung"] forKey:@"meassureDescription"];
- [aResult setValue:[NSNumber numberWithFloat:2.03] forKey:@"meassureResult"];
- [managedObjectContext save:nil];
- }
- - (void)viewDidUnload
- {
- [super viewDidUnload];
- }
- - (void)dealloc
- {
- self.fetchedResultsController.delegate = nil;
- self.fetchedResultsController = nil;
- [super dealloc];
- }
- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
- {
- return (interfaceOrientation == UIInterfaceOrientationPortrait);
- }
- #pragma mark - Table view data source
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return [[self.fetchedResultsController sections] count];
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
- return [sectionInfo numberOfObjects];
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- static NSString *CellIdentifier = @"Cell";
- UITableViewCell *cell =
- [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (cell == nil) {
- cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
- reuseIdentifier:CellIdentifier] autorelease];
- }
- MeassureData *meassureData = [fetchedResultsController objectAtIndexPath:indexPath];
- cell.textLabel.text = [meassureData.meassureResult stringValue];
- cell.detailTextLabel.text = meassureData.meassureDescription;
- return cell;
- }
- - (NSFetchedResultsController *)fetchedResultsController {
- if (fetchedResultsController != nil) {
- return fetchedResultsController;
- }
- NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
- NSEntityDescription *entity =
- [NSEntityDescription entityForName:@"MeassureData"
- inManagedObjectContext:managedObjectContext];
- [fetchRequest setEntity:entity];
- NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
- initWithKey:@"timeStamp" ascending:YES];
- [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
- NSFetchedResultsController *aFetchedResultsController =
- [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
- managedObjectContext:managedObjectContext
- sectionNameKeyPath:nil
- cacheName:@"Root"];
- aFetchedResultsController.delegate = self; // <label id="code.RVC.FRC.delegate"/>
- self.fetchedResultsController = aFetchedResultsController;
- [aFetchedResultsController release];
- [fetchRequest release];
- [sortDescriptor release];
- return fetchedResultsController;
- }
- - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
- {
- [outletTableView beginUpdates];
- }
- - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
- {
- [outletTableView endUpdates];
- }
- @end
Das XIB-File wurde automatisch von XCode erstellt. Darin habe ich nur einen TableView platziert. Delegate und DataSource sind mit dem FileOwner verbunden. Das IBOutlet "outletTableView" ist ebenfalls mit dem TableView verbunden.
Nachdem gelöscht wurde, wird (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView (zweimal?) aufgerufen, mit korrektem Rückgabewert. Danach (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section (einmal), ebenfalls mit korrektem Rückgabewert. Aber irgendwie scheint es den TableView nicht zu interessieren, erst nach Neustart der App wird es korrekt angezeigt.
Kann mir einer Helfen, was ich falsch mache?
Vielen Dank schon im Voraus!
Gruß Raphael