• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Programmabsturz beim Controller-push

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Hallo zusammen,

da ich nun doch schon ein wenig mit Objective-C auf dem Mac gemacht hab, wollte ich Neuland betreten indem ich mich mit der iOS-Entwicklung beschäftige. Konkret arbeite ich das Buch "iPhone-Apps entwickeln - Applikationen für iPhone,iPad und iPod touch programmieren" von Dr. Dirk Koller durch und stehe im Moment vor einem Problem.

Konkret harkts bei mir an einer Stelle, in der ich einen TableViewController auf den Stack des Navigation-Controllers packen möchte. Ich poste mal den Code:

Code:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    
	KundenTableViewController* controller = nil;
	switch (indexPath.row) {
		case 0:
			controller = self.kundenTableViewController;
			break;
		default:
			break;
	}
	
    [self.navigationController pushViewController:controller animated:YES];
}

Ich habe Controller in folgender Hierarchie:
1 Navigation-Controller
1 Menü-Controller (Subklasse von UITableViewController)
4 Controller (jeweils Subklasse von UITableViewController))

Obiger Code steht in der Implementierung des Menücontrollers, der dem Navigation-Controller unmittelbar beigeordnet ist. Über diesen Menü-Controller möchte ich meine 4 Controller für die untere Hierarchie aufrufen und mache das per Touch in die jeweilige Zeile in der Menü-Table. Der oben dargestellte kundenTableViewController ist einer der 4 benannten Untercontroller des Menücontrollers.

Durch Debuggen hab ich herausbekommen, dass in der letzten Zeile meine App abstürzt undzwar mit folgender Fehlermeldung:

Code:
2010-12-12 15:30:24.902 chronos[1051:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 "The operation couldn’t be completed. (Cocoa error 134100.)" UserInfo=0x6126a50 {metadata=<CFBasicHash 0x6125810 [0xffa3e0]>{type = immutable dict, count = 6,
entries =>
	0 : <CFString 0x6125fc0 [0xffa3e0]>{contents = "NSStoreModelVersionIdentifiers"} = <CFArray 0x61260a0 [0xffa3e0]>{type = immutable, count = 0, values = ()}
	2 : <CFString 0x6126010 [0xffa3e0]>{contents = "NSStoreModelVersionHashesVersion"} = <CFNumber 0x6112730 [0xffa3e0]>{value = +3, type = kCFNumberSInt32Type}
	3 : <CFString 0xe01354 [0xffa3e0]>{contents = "NSStoreType"} = <CFString 0xe01524 [0xffa3e0]>{contents = "SQLite"}
	4 : <CFString 0x6126040 [0xffa3e0]>{contents = "NSPersistenceFrameworkVersion"} = <CFNumber 0x6125ad0 [0xffa3e0]>{value = +320, type = kCFNumberSInt64Type}
	5 : <CFString 0x6126070 [0xffa3e0]>{contents = "NSStoreModelVersionHashes"} = <CFBasicHash 0x6126120 [0xffa3e0]>{type = immutable dict, count = 1,
entries =>
	0 : <CFString 0x61260c0 [0xffa3e0]>{contents = "Event"} = <CFData 0x61260d0 [0xffa3e0]>{length = 32, capacity = 32, bytes = 0x5431c046d30e7f32c2cc809958add1e7 ... 846e97d7af01cc79}
}

	6 : <CFString 0xe014e4 [0xffa3e0]>{contents = "NSStoreUUID"} = <CFString 0x6125dc0 [0xffa3e0]>{contents = "51089D01-8C47-4114-A9FA-7D36EFFA6DFA"}
}
, reason=The model used to open the store is incompatible with the one used to create the store}, {
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            Event = <5431c046 d30e7f32 c2cc8099 58add1e7 579ad104 a3aa8fc4 846e97d7 af01cc79>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
        );
        NSStoreType = SQLite;
        NSStoreUUID = "51089D01-8C47-4114-A9FA-7D36EFFA6DFA";
    };
    reason = "The model used to open the store is incompatible with the one used to create the store";
}

Die Fehlermeldung ließ mich vermuten, dass es irgendetwas mit dem NSFetchedResultsController zu tun hat, den ich in jedem der 4 "Untercontroller" nutze, um mir aus meinem Core-Data-Modell die Daten zu beschaffen. Tippfehler schließe ich soweit aber aus, ich habs x Mal nachkontrolliert.

Ich weiß das ist sicher wieder so eine Nadel im Heuhaufen, trotzdem bin ich für jede Hilfe dankbar!

Gruß
Marcus

Edit:
Okay meine Vermutung war richtig, ich hab meinen Breakpoint woanders gesetzt und bin tatsächlich in der Methode gelandet, die den NSFetchedResultsController initialisiert:

Code:
- (NSFetchedResultsController*)fetchedResultsController {
	chronosAppDelegate *appDelegate = (chronosAppDelegate*)[[UIApplication sharedApplication]delegate];
	
	if (fetchedResultsController != nil) {
		return fetchedResultsController;
	}
	
	NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
	
	// in genau dieser Zeile knallts 
	NSEntityDescription *entity = [NSEntityDescription entityForName:@"Kunde" 
											  inManagedObjectContext:appDelegate.managedObjectContext];
	[fetchRequest setEntity:entity];
	
	NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
	NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
	[fetchRequest setSortDescriptors:sortDescriptors];
	
	NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] 
															 initWithFetchRequest:fetchRequest 
															 managedObjectContext:appDelegate.managedObjectContext 
															   sectionNameKeyPath:nil 
															            cacheName:@"Root"];
	self.fetchedResultsController = aFetchedResultsController;
	
	[aFetchedResultsController release];
	[fetchRequest release];
	[sortDescriptor release];
	[sortDescriptors release];
	
	return fetchedResultsController;
}

In der kommentierten Zeile stürzt das Programm ab. Das Problem liegt also im Core Data Stack des AppDelegates :(
 
Zuletzt bearbeitet:

MarCus88

Alkmene
Registriert
29.10.09
Beiträge
31
Sorry für den dreisten Doppelpost, ich hab den Fehler gefunden. ;)