• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Mehrere Tags in NSDictionary für einzelnen Key

nelfisch

Carola
Registriert
15.03.08
Beiträge
108
Hej Leute,

und wieder lande ich im AT :) Diesmal habe ich ein, für mich echt kompliziertes, Problem: Ich würde in einer Such-Funktion meinen einzelnen Listeneinträgen gerne Tags zu weisen. Erläuterung:Wenn jemand nach dem Tag sucht, sollen alle ursprünglichen Listeneinträge angezeigt werden, die mit diesem Tag "Verknüpft" sind. Habe mir gedacht, ich mache einfach ein NSDictionary mit einem Array der Tags als Objekt und dem Listennamen als Key. Aber irgendwie stellte sich das dann doch als nicht so einfach herraus. Hier mal etwas Code:
Code:
tags = [[NSMutableDictionary alloc] initWithDictionary:[[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"Energie", @"Kinetik", @"Bewegung", nil] forKeys:[NSArray arrayWithObjects:@"KinetischeEnergie", @"KinetischeEnergie", @"KinetischeEnergie", nil]]];
	
	//MECHANIK
	[tags setObject:[NSArray arrayWithObjects:@"Energie", @"Potenzial", @"Bewegung", nil] forKey:@"PotenzielleEnergie"];
	[tags setObject:[NSArray arrayWithObjects:@"Beschleunigt", @"Bewegung", @"Gleichmäßig", nil] forKey:@"GleichmaesigBeschleunigt"];

So, soweit so gut, das Dictionary wird erst mal planmäíg befüllt. Dann habe ich mir gedacht, es wäre doch nicht schlecht, wenn wir erst mal alle Tags sammeln würden, um diese dann in unserer Suchliste abzubilden:
Code:
tags = [[NSDictionary alloc] initWithDictionary:[self.navigationController getDictForTags]];
NSArray* keyArray = [[NSArray alloc] initWithArray:[[self.navigationController getDictForTags] allKeys]];
	for(int i = 0; i < [keyArray count]; i++){
		
		if([[tags objectForKey:[keyArray objectAtIndex:i]] isKindOfClass:[NSArray class]]){
			
			
		NSString* string1 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:0]];
		NSString* string2 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:1]];
		NSString* string3 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:2]];
		
		if([allTags containsObject:string1] == FALSE){
			[allTags addObject:string1];
			
		}
	    if([allTags containsObject:string2] == FALSE){
			[allTags addObject:string2];
		}
		if([allTags containsObject:string3] == FALSE){
			[allTags addObject:string3];
		}
		
		}}
Das funktioniert auch noch alles super, ich habe die Tags dann in meinem Array. Damit hätte ich eigentlich alles, womit ich meine Suche implementieren könnte. Einziges Problem: Wie kriege ich meine Keys, also bei mir sind das NibNames, aus meinem Tags-Dictionary mithilfe der Einträge aus allTags wieder raus?! Ich habe es mit
Code:
[tags allKeysForObject:string1];
und ähnlichem versucht, komme aber leider auf keinen Grünen Zweig bei der Sache.

Meine Frage nun: Habt ihr eine Idee, wie ich mit meinem Ansatz ans Ziel komme oder habt ihr sogar noch einen besseren ohne so viele Umwege? :D

Greetz,

nelfisch
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Hier mal etwas Code:
Code:
tags = [[NSMutableDictionary alloc] initWithDictionary:[[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:@"Energie", @"Kinetik", @"Bewegung", nil] forKeys:[NSArray arrayWithObjects:@"KinetischeEnergie", @"KinetischeEnergie", @"KinetischeEnergie", nil]]];
Warum erzeugst Du erst ein NSDictionary, aus dem Du dann gleich ein NSMutableDictionary erzeugst? Das Du so außerdem ein Speicherleck erzeugst ist Dir bewusst? Keys kann man auch nur einmal im Dictionary haben. Du wirst hier also am Ende nur ein Objekt-Key-Paar im Dictionary haben.


Code:
tags = [[NSDictionary alloc] initWithDictionary:[self.navigationController getDictForTags]];
NSArray* keyArray = [[NSArray alloc] initWithArray:[[self.navigationController getDictForTags] allKeys]];
	for(int i = 0; i < [keyArray count]; i++){
		
		if([[tags objectForKey:[keyArray objectAtIndex:i]] isKindOfClass:[NSArray class]]){
			
			
		NSString* string1 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:0]];
		NSString* string2 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:1]];
		NSString* string3 = [NSString stringWithFormat:@"%@",[[tags objectForKey:[keyArray objectAtIndex:i]] objectAtIndex:2]];
		
		if([allTags containsObject:string1] == FALSE){
			[allTags addObject:string1];
			
		}
	    if([allTags containsObject:string2] == FALSE){
			[allTags addObject:string2];
		}
		if([allTags containsObject:string3] == FALSE){
			[allTags addObject:string3];
		}
		
		}}
Das funktioniert auch noch alles super
Warum erzeugst Du überall neue Objekte? Super ist das nicht. ;) Ich schätze mal, Dein Speicher wird durchlöchert, wie ein Schweizer Käse.

Meine Frage nun: Habt ihr eine Idee, wie ich mit meinem Ansatz ans Ziel komme oder habt ihr sogar noch einen besseren ohne so viele Umwege? :D
Warum drehst Du das nicht einfach um. Mach Dir doch ein Dictionary, wo Du die Tags als Keys benutzt und denen dann als Array die Listeneinträge zuordnest. Die Suche nach den Listeneinträgen eines Tags beschränkt sich dann ein objectForKey: Aufruf.

MacApple