2009-06-02 3 views
1

Ich erstellte einen PLIST, der eine NSDictionary-Struktur enthält. Der Schlüssel ist ein Label (mit dem ich tableview cell.text auffüllen kann) und der Wert ist ein Dateiname, mit dem ich "cell.image" dynamisch füllen möchte. Die exakten PNG-Dateinamen werden in das Projekt geladen.Verwirrt bei dem Versuch, cell.image mithilfe von UIImage festzulegen: imageNamed:

Um die Dinge einfacher zu machen (so dachte ich), lade ich das PLIST in ein NSDictionary, dann ziehe es auseinander in zwei Arrays (mit allKeys und allValues).

Bei dem Versuch, eine Zelle Bild zu setzen, ich verstehe nicht, warum das funktioniert:

cell.image = [UIImage imageNamed:@"bad.png"]; 

und dies nicht (in Simulator - ich einen App Absturz bekommen und in Debugger barfing):

cell.image = [UIImage imageNamed:[rowImageList objectAtIndex:indexPath.row]]; 

kann ich diese nächste Zeile setzen kurz vor dem zweiten Stück Code und es funktioniert gut, so scheint es, dass ich eine NSString aus objectAtIndex bin immer:

NSLog(@"Image name: %@", [rowImageList objectAtIndex:indexPath.row]); 

Ich habe auch versucht, einen temporären NSString zu erstellen und ihm [rowImageList objectAtIndex:] zuzuweisen und dann diesen NSString zu verwenden, um imageNamed: zu liefern. Hier

einige Informationen von Debugger:

- [NSCFArray Länge]: Unbekannter Selektor an Instanz gesendet 0x262d910

beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: ‚* ** - [NSCFArray Länge]: Unbekannte Wähler auf Instanz 0x262d910' gesendet

Lassen Sie mich k jetzt, wenn Sie mehr Info/Code benötigen.

Edit: Hier ist, wie ich bevölkern rowImageList:

NSArray *myRowImages = [[NSArray alloc] init]; 
myRowImages = [searchFilterList allValues]; 
self.rowImageList = [myRowImages copy]; 
[myRowImages release]; 
//where searchFilterList is an NSDictionary that I loaded from a plist 

Hier ein Screenshot von meinem plist ist: [IMG] http://i42.tinypic.com/14uwffa.jpg http://i42.tinypic.com/14uwffa.jpg [/ IMG]

Edit: überarbeitet rowImageList Bevölkerung:

NSMutableArray *myRowImages = [[NSMutableArray alloc] init]; 
NSEnumerator *enumerator = [searchFilterList objectEnumerator]; 
id object; 

while ((object = [enumerator nextObject])) { 
    [myRowImages addObject:[object objectAtIndex:0]]; 
} 
self.rowImageList = myRowImages; //edit: added self. prefix 
[myRowImages release]; 
+0

Hmm ... Ich muss die Dinge noch einmal überprüfen. rowImageList IS ist ein Array, aber ich nahm an, dass ich NSStrings auf das Array (d. h. ein Array von NSString-Objekten) "schob". So füllen Sie rowImageList: \t NSArray * myRowImages = [[NSArray alloc] init]; \t myRowImages = [searchFilterList allValues]; \t self.rowImageList = [Kopie myRowImages]; \t [myRowImages release]; - wo searchFilterList ein NSDictionary ist, das ich von einem Plist geladen habe. – kindaran

+0

Guter Gott, das hat nicht sehr gut formatiert. – kindaran

+0

Wenn Sie folgen, änderte ich schließlich "rowImageList = myRowImages;" zu "self.rowImageList = myRowImages;" War komischer Mist mit dem Versuch, rowImageList später im Code zu verwenden. – kindaran

Antwort

1

Ich würde die Ausgabe von NSLog() überprüfen und sicherstellen, dass es kein Array ist, das einen NSString enthält. Das sagt dir der Fehler; Sie übergeben ein NSArray, in dem ein NSString erwartet wird.

+0

Ja, ihr habt Recht. Ich habe ein Array zurück statt einer Zeichenfolge erhalten. Ich poste eine neue (aber vielleicht noch nicht ganz richtige) Version der Array-Ladung. – kindaran

1

Dieser Fehler bedeutet, dass [rowImageList objectAtIndex: indexPath.row] ein Array und nicht wie erwartet eine Zeichenfolge zurückgibt.

Der Grund, warum ein Wert gedruckt wird, liegt darin, dass zum Drucken eines Arrays auch% @ in der NSLog-Anweisung angegeben werden muss.

Versuchen Sie, die Methode zu debuggen und überprüfen Sie die Klasse von [rowImageList objectAtIndex: indexPath.row]. Es wird höchstwahrscheinlich ein Array sein.

0

Sind Sie sicher, dass Ihr PLIST Schlüssel/String-Paare ist und Sie die Namen nicht irgendwie in einem Array verpackt haben?

+0

Ich bin mir jetzt an nichts sicher. Die plist-Struktur ist Dictionary (root)> Array (Kind)> String (Kind des Arrays) mit 4 Paaren Array/String. Ich habe versucht, ein weiteres Beispiel für einen Plist zu kopieren. Meine Annahme war, dass ich eine NSDictionary-Struktur erstellte, in der Array der Schlüssel und String der Wert ist. Nicht sicher, wie klar diese Erklärung ist. – kindaran

+0

Sie missverstehen Ihre Plist. Die Schlüssel in Ihrem Plist sind die Strings "All Items", "Good Items" usw. Die Werte sind Arrays. Die Strings gehören zu den Arrays. Sie sollten NSLog (@ "% @", searchFilterList) hinzufügen und sehen, ob Sie Ihre Datenstruktur verstehen können. Wie laden Sie diese Plattform? –

+0

Aus der Art, wie Ihr Array strukturiert ist, möchten Sie Folgendes verwenden: cell.image = [UIImage imageNamed: [[rowImageList objectAtIndex: indexPath.row] objectAtIndex: 0]]; Wenn Sie allValues ​​im Dictionary verwenden, erhalten Sie ein Array zurück, das vier Arrays enthält - jedes dieser Arrays enthält eine Zeichenfolge. Der NSlog hätte den Array-Inhalt gedruckt, so dass er OK aussehen würde, aber Ihr Bild wäre null. –