Probleme mit TableView und XML (TouchXML)

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

  • Probleme mit TableView und XML (TouchXML)

    Hallo Leute,

    ich trete an euch heran, weil ich langsam echt nicht mehr weiter weiß. Ich brauche dringend euch HIlfe. Es geht um meine Abschlussarbeit, bei der ich einfach auf der Stelle trammpel. Ich habe eine Navigation Based App gebaut mit einer TableView. Die Navigation wird aus einem XML-File gelesen, welches ihr hier seht:


    Quellcode

    1. </item>
    2. </item>
    3. </item>
    4. </item>
    5. </item>
    6. </item>
    Alles anzeigen

    An diesem XML-File kann ich auch nichts ändern. Das bekomme ich so. Nun habe in der "ViewDidLoad" Methode ein Array mit CXMLElements gefüllt. Beim Debuggen habe ich festgestellt, dass es sich aber scheinbar um CXMLNodes handelt. Naja... CXMLElemente haben die Eigenschaft "elementsForName" um Subelemente mit einem bestimmten Namen zu bekommen.

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. ...
    3. NSString *cellValue = [[[[self.tableDataSource objectAtIndex:indexPath.row] elementsForName:@"text"] objectAtIndex:0] stringValue];
    4. [[cell textLabel] setText:cellValue];
    5. ...
    6. }


    Das funktioniert auch super. Aber in der Methode "didSelectRowAtIndexPath:" will ich wieder auf diese Eigenschaft zugreifen und meine App bricht einfach "zusammen".

    Quellcode

    1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    2. ...
    3. NSString *cellValue = [[[[self.tableDataSource objectAtIndex:indexPath.row] elementsForName:@"text"] objectAtIndex:0] stringValue];
    4. NSLog(@"TEST: %@",cellValue);
    5. ...
    6. }


    Leider gibt es keine Compilerwarnung. Nun habe ich mal das ganze im unteren Teil so umgebaut:

    Quellcode

    1. CXMLElement *Object1 = [self.tableDataSource objectAtIndex:indexPath.row];
    2. NSArray *myArray = [Object1 elementsForName:@"text"];
    3. CXMLNode *Object2 = [myArray objectAtIndex:0];
    4. NSString *myName = [Object2 name];


    und dann nochmal debuggt. Ich habe einen Breakpoint auf die erste Zeile gesetzt und bin schrittweise durchgegangen. Beim Step von der 3. in die 4. Zeile ist die App zusammengebrochen. Ich habe die Variablen mal in Expression angeschaut. Das Bild sieht LEIDER so aus:
    [Blockierte Grafik: http://img842.imageshack.us/img842/540/screenshoty.png]

    MyArray bleibt leider leer. Es werden keine Elemente gefunden. Wenn man aber mal schaut, müssten da eigentlich Elemente drin sein, weil es der zweite Hauptmenüpunkt ist (der angeklickt wurde) und der hat wieder Unterpunkte (Siehe oben).

    Hinweis: Ich arbeite mit TOUCHXML.

    Ich hoffe, ihr könnt mir irgendwie helfen. Ich will nicht, dass mein Abschlussprojekt scheitert.

    Grüße
    Vivid
  • Nein, es hat keine Elemente!

    Kann es etwas mit dem Autorelease zu tun haben? Dass mein CXMLElement bzw. mein tableDataSource schon wieder released wurden?? Beim Scrollen crasht die App auch. Weiß nur nicht, wie ich das mit retain fixen soll. :( Bin noch neu!
  • Vivid schrieb:

    Die Navigation wird aus einem XML-File gelesen, welches ihr hier seht:


    Quellcode

    1. </item>
    2. </item>
    3. </item>
    4. </item>
    5. </item>
    6. </item>

    An diesem XML-File kann ich auch nichts ändern. Das bekomme ich so.

    Das XML-File sieht ernsthaft so aus? Ziemlich leer würde ich sagen.

    Vivid schrieb:

    Nun habe in der "ViewDidLoad" Methode ein Array mit CXMLElements gefüllt.

    Ich vermute mal, da beginnt schon das Übel.


    Vivid schrieb:

    Leider gibt es keine Compilerwarnung. Nun habe ich mal das ganze im unteren Teil so umgebaut:

    Quellcode

    1. CXMLElement *Object1 = [self.tableDataSource objectAtIndex:indexPath.row];
    2. NSArray *myArray = [Object1 elementsForName:@"text"];
    3. CXMLNode *Object2 = [myArray objectAtIndex:0];
    4. NSString *myName = [Object2 name];


    und dann nochmal debuggt. Ich habe einen Breakpoint auf die erste Zeile gesetzt und bin schrittweise durchgegangen. Beim Step von der 3. in die 4. Zeile ist die App zusammengebrochen. Ich habe die Variablen mal in Expression angeschaut. Das Bild sieht LEIDER so aus:
    [Blockierte Grafik: http://img842.imageshack.us/img842/540/screenshoty.png]

    MyArray bleibt leider leer. Es werden keine Elemente gefunden. Wenn man aber mal schaut, müssten da eigentlich Elemente drin sein, weil es der zweite Hauptmenüpunkt ist (der angeklickt wurde) und der hat wieder Unterpunkte (Siehe oben).

    Vorrausgesetzt die verwendeten Methoden und Klassen stimmen so (ich kenne die nicht), gibt es dann wohl kein Element mit dem Namen "text". Nach dem, was Du hier gepostest hast, liegt es an der XML-Datei. Da steht doch nix drin.

    Michael
  • Ja aber warum funktioniert es weiter oben?

    Hier nochmal das XML-File:

    XML-Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    2. <navigation>
    3. <item id="i0000" src="content/i0000.xml" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[Welcome]]></text>
    4. </item>
    5. <item id="k1000" src="" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[WBT]]></text>
    6. <item id="k1010" src="" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[Chapter 1.1]]></text>
    7. <item id="i1011" src="content/i1011.xml" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[Infopage]]></text>
    8. </item>
    9. </item>
    10. <item id="k1100" src="" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[Chapter 1.2]]></text>
    11. <item id="i1101" src="content/i1101.xml" version="" active="1" visible="1" pagetype="" next="" properties=""><text><![CDATA[Subpage]]></text>
    12. </item>
    13. </item>
    14. </item>
    15. </navigation>
    Alles anzeigen


    Und so habe ich mein Array tableDataSource in "ViewDidLoad" der TableView befüllt:

    Quellcode

    1. NSString *XMLPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"navtree2.xml"];
    2. NSData *XMLData = [NSData dataWithContentsOfFile:XMLPath];CXMLDocument *doc = [[[CXMLDocument alloc] initWithData:XMLData options:0 error:nil] autorelease];self.tableDataSource = [[NSMutableArray alloc] init];for (CXMLElement *itemElement in XMLNavigation) {
    3. if ([itemElement parent] == nil) {
    4. [self.tableDataSource addObject:itemElement];
    5. }
    6. }



    Hoffe, das XML wird diesmal hier richtig angezeigt.

    Vivid
  • Hallo,

    ich habe jetzt nochmal debuggt und in der Zeile:

    Quellcode

    1. CXMLElement *Object1 = [self.tableDataSource objectAtIndex:1];



    kam folgender Fehler:

    Quellcode

    1. *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'



    Ist das eine OutOfBounds-Exception? Also dass er auf ein Index zugreift, der nicht vorhanden ist?