UITableView in UIViewController mit XIB?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UITableView in UIViewController mit XIB?

    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:

    Quellcode

    1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    4. self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];
    5. self.resultViewController = [[[ResultViewController alloc] initWithNibName:@"ResultViewController" bundle:nil] autorelease];
    6. self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    7. navigationController = [[UINavigationController alloc] initWithRootViewController:self.resultViewController];
    8. self.tabBarController.viewControllers = [NSArray arrayWithObjects:self.firstViewController, navigationController, nil];
    9. self.window.rootViewController = self.tabBarController;
    10. self.resultViewController.managedObjectContext = self.managedObjectContext;
    11. [self.window makeKeyAndVisible];
    12. return YES;
    13. }
    Alles anzeigen



    ResultViewController.h:

    Quellcode

    1. @interface ResultViewController : UIViewController <NSFetchedResultsControllerDelegate, UITableViewDelegate, UITableViewDataSource>
    2. {
    3. NSManagedObjectContext *_context;
    4. IBOutlet UITableView *outletTableView;
    5. }
    6. @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    7. @property (nonatomic, retain) NSFetchedResultsController * fetchedResultsController;
    8. @end
    Alles anzeigen



    ResultViewController.m:

    Quellcode

    1. #import "ResultViewController.h"
    2. @interface ResultViewController ()
    3. @end
    4. @implementation ResultViewController
    5. @synthesize managedObjectContext;
    6. @synthesize fetchedResultsController;
    7. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    8. {
    9. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    10. if (self) {
    11. self.title = NSLocalizedString(@"Ergebnisse", @"Ergebnisse");
    12. }
    13. return self;
    14. }
    15. - (void)turnOnEditing {
    16. [self.navigationItem.rightBarButtonItem release];
    17. self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(turnOffEditing)];
    18. [outletTableView setEditing:YES animated:YES];
    19. }
    20. - (void)turnOffEditing {
    21. [self.navigationItem.rightBarButtonItem release];
    22. self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(turnOnEditing)];
    23. [outletTableView setEditing:NO animated:YES];
    24. }
    25. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    26. if (editingStyle == UITableViewCellEditingStyleDelete) {
    27. NSManagedObjectContext *newcontext = [self.fetchedResultsController managedObjectContext];
    28. [newcontext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    29. NSError *error;
    30. if (![newcontext save:&error]) {
    31. // Handle the error...
    32. }
    33. [outletTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
    34. }
    35. [tableView reloadData];
    36. }
    37. - (void)viewDidLoad
    38. {
    39. [super viewDidLoad];
    40. self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(turnOnEditing)];
    41. NSError *error = nil;
    42. if (![[self fetchedResultsController] performFetch:&error]) {
    43. // Update to handle the error appropriately.
    44. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    45. exit(-1); // Fail
    46. }
    47. //Testdaten
    48. NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    49. NSEntityDescription *entity = [self.fetchedResultsController.fetchRequest entity];
    50. MeassureData *aResult = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
    51. [aResult setValue:[NSDate date] forKey:@"timeStamp"];
    52. [aResult setValue:[NSString stringWithFormat:@"A Beschreibung"] forKey:@"meassureDescription"];
    53. [aResult setValue:[NSNumber numberWithFloat:2.03] forKey:@"meassureResult"];
    54. [managedObjectContext save:nil];
    55. }
    56. - (void)viewDidUnload
    57. {
    58. [super viewDidUnload];
    59. }
    60. - (void)dealloc
    61. {
    62. self.fetchedResultsController.delegate = nil;
    63. self.fetchedResultsController = nil;
    64. [super dealloc];
    65. }
    66. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    67. {
    68. return (interfaceOrientation == UIInterfaceOrientationPortrait);
    69. }
    70. #pragma mark - Table view data source
    71. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    72. {
    73. return [[self.fetchedResultsController sections] count];
    74. }
    75. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    76. {
    77. id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    78. return [sectionInfo numberOfObjects];
    79. }
    80. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    81. {
    82. static NSString *CellIdentifier = @"Cell";
    83. UITableViewCell *cell =
    84. [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    85. if (cell == nil) {
    86. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
    87. reuseIdentifier:CellIdentifier] autorelease];
    88. }
    89. MeassureData *meassureData = [fetchedResultsController objectAtIndexPath:indexPath];
    90. cell.textLabel.text = [meassureData.meassureResult stringValue];
    91. cell.detailTextLabel.text = meassureData.meassureDescription;
    92. return cell;
    93. }
    94. - (NSFetchedResultsController *)fetchedResultsController {
    95. if (fetchedResultsController != nil) {
    96. return fetchedResultsController;
    97. }
    98. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    99. NSEntityDescription *entity =
    100. [NSEntityDescription entityForName:@"MeassureData"
    101. inManagedObjectContext:managedObjectContext];
    102. [fetchRequest setEntity:entity];
    103. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
    104. initWithKey:@"timeStamp" ascending:YES];
    105. [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    106. NSFetchedResultsController *aFetchedResultsController =
    107. [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
    108. managedObjectContext:managedObjectContext
    109. sectionNameKeyPath:nil
    110. cacheName:@"Root"];
    111. aFetchedResultsController.delegate = self; // <label id="code.RVC.FRC.delegate"/>
    112. self.fetchedResultsController = aFetchedResultsController;
    113. [aFetchedResultsController release];
    114. [fetchRequest release];
    115. [sortDescriptor release];
    116. return fetchedResultsController;
    117. }
    118. - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
    119. {
    120. [outletTableView beginUpdates];
    121. }
    122. - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
    123. {
    124. [outletTableView endUpdates];
    125. }
    126. @end
    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