UITableView mit Core Data

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

  • UITableView mit Core Data

    Hallo Leute,

    ich habe ein schönes Video- Tutorial bezüglich UITableView und CoreData gefunden ( Tutorial ), welches ich auch nach programmiert habe. Jetzt habe ich allerdings das Problem, dass mir das Programm beim klicken auf den Speichern-Button abstürzt. Die Fehlermeldung ist, dass ein String verlangt wird, ich aber ein UITextField mitgebe. Beim Kompilieren gibt es allerdings keine Fehlermeldung und ich weiß auch nicht , wo ich genau diesen Wert mitgeben muss. Ist bestimmt ein ganz simpler Anfänger- Fehler, aber ich finde ihn einfach nicht. Ich hoffe jemand von euch kann mir helfen. Ich programmiere mit Ver. 3.2.3.

    Genaue Fehlermeldung:

    Quellcode

    1. 2010-08-01 16:04:50.420 CoreData[811:207] *** Terminating app due to uncaught exception
    2. 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "firstName";
    3. desired type = NSString; given type = UITextField; value = <UITextField: 0x5b5ee90; frame = (74 94; 97 31);
    4. text = 'te'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x5b5efa0>>.'


    Vielen Dank!

    Snap!
  • Controller:

    AddViewController.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @protocol AddViewControllerDelegate;
    3. @interface AddViewController : UIViewController {
    4. UITextField *firstNameField;
    5. UITextField *lastNameField;
    6. id <AddViewControllerDelegate> delegate;
    7. id editedObject;
    8. }
    9. -(IBAction)save;
    10. @property (nonatomic, retain) IBOutlet UITextField *firstNameField;
    11. @property (nonatomic, retain) IBOutlet UITextField *lastNameField;
    12. @property (nonatomic, retain) id <AddViewControllerDelegate> delegate;
    13. @property (nonatomic, retain) id editedObject;
    14. @end
    15. @protocol AddViewControllerDelegate
    16. -(void)addViewController:(AddViewController *)controller didFinishWithSave:(BOOL)save;
    17. @end
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snap ()

  • AddViewController.m

    Quellcode

    1. #import "AddViewController.h"
    2. @implementation AddViewController
    3. @synthesize firstNameField, lastNameField, delegate, editedObject;
    4. -(IBAction)save {
    5. [editedObject setValue:firstNameField forKey:@"firstName"];
    6. [editedObject setValue:lastNameField forKey:@"lastName"];
    7. [delegate addViewController:self didFinishWithSave:YES];
    8. }
    9. /*
    10. // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    11. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    12. if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    13. // Custom initialization
    14. }
    15. return self;
    16. }
    17. */
    18. /*
    19. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    20. - (void)viewDidLoad {
    21. [super viewDidLoad];
    22. }
    23. */
    24. /*
    25. // Override to allow orientations other than the default portrait orientation.
    26. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    27. // Return YES for supported orientations
    28. return (interfaceOrientation == UIInterfaceOrientationPortrait);
    29. }
    30. */
    31. - (void)didReceiveMemoryWarning {
    32. // Releases the view if it doesn't have a superview.
    33. [super didReceiveMemoryWarning];
    34. // Release any cached data, images, etc that aren't in use.
    35. }
    36. - (void)viewDidUnload {
    37. [super viewDidUnload];
    38. // Release any retained subviews of the main view.
    39. // e.g. self.myOutlet = nil;
    40. }
    41. - (void)dealloc {
    42. [editedObject release];
    43. [super dealloc];
    44. }
    45. @end
    Alles anzeigen
  • macmoonshine schrieb:

    Schau Dir bitte die Zeilen 7 bis 10 ganz genau an. ;)

    Hmm,
    ich habe Sie mal wie folgt editiert, funktioniert aber auch nicht, gleiche Fehlermeldung:

    Quellcode

    1. -(IBAction)save {
    2. [editedObject setValue:firstNameField forKey:(NSString *)@"firstName"];
    3. [editedObject setValue:lastNameField forKey:(NSString *)@"lastName"];
    4. [delegate addViewController:self didFinishWithSave:YES];
    5. }
  • Ich habe jetzt noch folgendes probiert:

    AddViewController.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. @protocol AddViewControllerDelegate;
    3. @interface AddViewController : UIViewController {
    4. NSString *firstNameField;
    5. NSString *lastNameField;
    6. id <AddViewControllerDelegate> delegate;
    7. id editedObject;
    8. }
    9. -(IBAction)save;
    10. @property (nonatomic, retain) IBOutlet NSString *firstNameField;
    11. @property (nonatomic, retain) IBOutlet NSString *lastNameField;
    12. @property (nonatomic, retain) id <AddViewControllerDelegate> delegate;
    13. @property (nonatomic, retain) id editedObject;
    14. @end
    15. @protocol AddViewControllerDelegate
    16. -(void)addViewController:(AddViewController *)controller didFinishWithSave:(BOOL)save;
    17. @end
    Alles anzeigen


    Leider auch ohne Erfolg.
  • Snap schrieb:

    [
    ich habe Sie mal wie folgt editiert, funktioniert aber auch nicht, gleiche Fehlermeldung:

    Quellcode

    1. -(IBAction)save {
    2. [editedObject setValue:firstNameField forKey:(NSString *)@"firstName"];
    3. [editedObject setValue:lastNameField forKey:(NSString *)@"lastName"];
    4. [delegate addViewController:self didFinishWithSave:YES];
    5. }

    Abgesehen davon @"firstName" und @"lastName" bereits Strings sind und casten nicht den Typ des Operanden verändert, habe ich den Value-Parameter, den Du an setValue:forKey: übergibst, gemeint.
    „Meine Komplikation hatte eine Komplikation.“
  • So ganz verstehe ich nicht was genau gemeint ist.
    Ich poste nochmal den kompletten Quelltext:

    RootViewController.m

    Quellcode

    1. #import "RootViewController.h"
    2. @interface RootViewController ()
    3. - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath;
    4. @end
    5. @implementation RootViewController
    6. @synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_;
    7. -(void)addViewController:(AddViewController *)controller didFinishWithSave:(BOOL)save{
    8. [self dismissModalViewControllerAnimated:YES];
    9. [self.tableView reloadData];
    10. }
    11. #pragma mark -
    12. #pragma mark View lifecycle
    13. - (void)viewDidLoad {
    14. [super viewDidLoad];
    15. self.navigationItem.leftBarButtonItem = self.editButtonItem;
    16. UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject)];
    17. self.navigationItem.rightBarButtonItem = addButton;
    18. [addButton release];
    19. }
    20. - (void)viewWillAppear:(BOOL)animated {
    21. [super viewWillAppear:animated];
    22. }
    23. - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    24. NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    25. cell.textLabel.text = [[managedObject valueForKey:@"firstName"] description];
    26. cell.detailTextLabel.text = [[managedObject valueForKey:@"lastName"] description];
    27. }
    28. #pragma mark -
    29. #pragma mark Add a new object
    30. - (void)insertNewObject {
    31. AddViewController *addViewController = [[AddViewController alloc] initWithNibName:@"AddViewController" bundle:nil];
    32. [self.navigationController presentModalViewController:addViewController animated:YES];
    33. NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    34. NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    35. NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
    36. addViewController.delegate = self;
    37. addViewController.editedObject = newManagedObject;
    38. [addViewController release];
    39. NSError *error;
    40. if (![context save:&error]) {
    41. }
    42. }
    43. #pragma mark -
    44. #pragma mark Table view data source
    45. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    46. return [[self.fetchedResultsController sections] count];
    47. }
    48. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    49. id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    50. return [sectionInfo numberOfObjects];
    51. }
    52. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    53. static NSString *CellIdentifier = @"Cell";
    54. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    55. if (cell == nil) {
    56. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    57. }
    58. [self configureCell:cell atIndexPath:indexPath];
    59. return cell;
    60. }
    61. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    62. if (editingStyle == UITableViewCellEditingStyleDelete) {
    63. NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    64. [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    65. NSError *error = nil;
    66. if (![context save:&error]) {
    67. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    68. abort();
    69. }
    70. }
    71. }
    72. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    73. return NO;
    74. }
    75. #pragma mark -
    76. #pragma mark Table view delegate
    77. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    78. }
    79. #pragma mark -
    80. #pragma mark Fetched results controller
    81. - (NSFetchedResultsController *)fetchedResultsController {
    82. if (fetchedResultsController_ != nil) {
    83. return fetchedResultsController_;
    84. }
    85. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    86. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:self.managedObjectContext];
    87. [fetchRequest setEntity:entity];
    88. [fetchRequest setFetchBatchSize:20];
    89. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:NO];
    90. NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    91. [fetchRequest setSortDescriptors:sortDescriptors];
    92. NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    93. aFetchedResultsController.delegate = self;
    94. self.fetchedResultsController = aFetchedResultsController;
    95. [aFetchedResultsController release];
    96. [fetchRequest release];
    97. [sortDescriptor release];
    98. [sortDescriptors release];
    99. NSError *error = nil;
    100. if (![fetchedResultsController_ performFetch:&error]) {
    101. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    102. abort();
    103. }
    104. return fetchedResultsController_;
    105. }
    106. #pragma mark -
    107. #pragma mark Fetched results controller delegate
    108. - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    109. [self.tableView beginUpdates];
    110. }
    111. - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
    112. atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
    113. switch(type) {
    114. case NSFetchedResultsChangeInsert:
    115. [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    116. break;
    117. case NSFetchedResultsChangeDelete:
    118. [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    119. break;
    120. }
    121. }
    122. - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
    123. atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
    124. newIndexPath:(NSIndexPath *)newIndexPath {
    125. UITableView *tableView = self.tableView;
    126. switch(type) {
    127. case NSFetchedResultsChangeInsert:
    128. [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    129. break;
    130. case NSFetchedResultsChangeDelete:
    131. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    132. break;
    133. case NSFetchedResultsChangeUpdate:
    134. [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    135. break;
    136. case NSFetchedResultsChangeMove:
    137. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    138. [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationFade];
    139. break;
    140. }
    141. }
    142. - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    143. [self.tableView endUpdates];
    144. }
    145. #pragma mark -
    146. #pragma mark Memory management
    147. - (void)didReceiveMemoryWarning {
    148. [super didReceiveMemoryWarning];
    149. }
    150. - (void)viewDidUnload {
    151. }
    152. - (void)dealloc {
    153. [fetchedResultsController_ release];
    154. [managedObjectContext_ release];
    155. [super dealloc];
    156. }
    157. @end
    Alles anzeigen
  • RootViewController.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import <CoreData/CoreData.h>
    3. #import "AddViewController.h"
    4. @interface RootViewController : UITableViewController <NSFetchedResultsControllerDelegate, AddViewControllerDelegate> {
    5. @private
    6. NSFetchedResultsController *fetchedResultsController_;
    7. NSManagedObjectContext *managedObjectContext_;
    8. }
    9. @property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
    10. @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
    11. @end
    Alles anzeigen
  • CoreDataAppDelegate.h

    Quellcode

    1. #import <UIKit/UIKit.h>
    2. #import <CoreData/CoreData.h>
    3. @interface CoreDataAppDelegate : NSObject <UIApplicationDelegate> {
    4. UIWindow *window;
    5. UINavigationController *navigationController;
    6. @private
    7. NSManagedObjectContext *managedObjectContext_;
    8. NSManagedObjectModel *managedObjectModel_;
    9. NSPersistentStoreCoordinator *persistentStoreCoordinator_;
    10. }
    11. @property (nonatomic, retain) IBOutlet UIWindow *window;
    12. @property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
    13. @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
    14. @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
    15. @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    16. - (NSString *)applicationDocumentsDirectory;
    17. @end
    Alles anzeigen
  • CoreApp.Delegate.m

    Quellcode

    1. #import "CoreDataAppDelegate.h"
    2. #import "RootViewController.h"
    3. @implementation CoreDataAppDelegate
    4. @synthesize window;
    5. @synthesize navigationController;
    6. #pragma mark -
    7. #pragma mark Application lifecycle
    8. - (void)awakeFromNib {
    9. RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
    10. rootViewController.managedObjectContext = self.managedObjectContext;
    11. }
    12. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    13. [window addSubview:navigationController.view];
    14. [window makeKeyAndVisible];
    15. return YES;
    16. }
    17. - (void)applicationWillTerminate:(UIApplication *)application {
    18. NSError *error = nil;
    19. if (managedObjectContext_ != nil) {
    20. if ([managedObjectContext_ hasChanges] && ![managedObjectContext_ save:&error]) {
    21. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    22. abort();
    23. }
    24. }
    25. }
    26. #pragma mark -
    27. #pragma mark Core Data stack
    28. - (NSManagedObjectContext *)managedObjectContext {
    29. if (managedObjectContext_ != nil) {
    30. return managedObjectContext_;
    31. }
    32. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    33. if (coordinator != nil) {
    34. managedObjectContext_ = [[NSManagedObjectContext alloc] init];
    35. [managedObjectContext_ setPersistentStoreCoordinator:coordinator];
    36. }
    37. return managedObjectContext_;
    38. }
    39. - (NSManagedObjectModel *)managedObjectModel {
    40. if (managedObjectModel_ != nil) {
    41. return managedObjectModel_;
    42. }
    43. NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
    44. NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    45. managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    46. return managedObjectModel_;
    47. }
    48. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    49. if (persistentStoreCoordinator_ != nil) {
    50. return persistentStoreCoordinator_;
    51. }
    52. NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreData.sqlite"]];
    53. NSError *error = nil;
    54. persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    55. if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    56. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    57. abort();
    58. }
    59. return persistentStoreCoordinator_;
    60. }
    61. #pragma mark -
    62. #pragma mark Application's Documents directory
    63. - (NSString *)applicationDocumentsDirectory {
    64. return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    65. }
    66. #pragma mark -
    67. #pragma mark Memory management
    68. - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    69. }
    70. - (void)dealloc {
    71. [managedObjectContext_ release];
    72. [managedObjectModel_ release];
    73. [persistentStoreCoordinator_ release];
    74. [navigationController release];
    75. [window release];
    76. [super dealloc];
    77. }
    78. @end
    Alles anzeigen
  • Wir diskutieren hier die ganze Zeit doch über die save-Methode. Du hast ja schließlich selbst geschrieben, dass der Debugger beim Absturz dort stoppt. Wieso postest Du dann weiteren Code?

    In der Methode save rufst Du zweimal die Methode setValue:forKey: auf. Von diesen zwei Aufrufen schreibe ich seit dem Du die Methode das erste Mal gepostet hast.

    So, alle außer Snap mal bitte die Ohren zuhalten:

    WELCHEN DATENTYP HATBEN DIE VALUE-PARAMETER, DIE DU BEI DIESEN AUFRUFEN ÜBERGIBST?
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Wir diskutieren hier die ganze Zeit doch über die save-Methode. Du hast ja schließlich selbst geschrieben, dass der Debugger beim Absturz dort stoppt. Wieso postest Du dann weiteren Code?

    In der Methode save rufst Du zweimal die Methode setValue:forKey: auf. Von diesen zwei Aufrufen schreibe ich seit dem Du die Methode das erste Mal gepostet hast.

    So, alle außer Snap mal bitte die Ohren zuhalten:

    WELCHEN DATENTYP HATBEN DIE VALUE-PARAMETER, DIE DU BEI DIESEN AUFRUFEN ÜBERGIBST?

    Sorry, wie schon gesagt bin ich Anfänger und ich weiß nicht genau was gemeint ist. Und damit man sehen kann was wo übergeben wird, habe ich den kompletten Quelltext gepostet.
    Oder meinst du den "Type" des Attributes in CoreData? Das ist ein String.