Tableview reloadData klappt nicht - NSArray invalid summary

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

  • Tableview reloadData klappt nicht - NSArray invalid summary

    Hi erstmal,

    normalweise wühle ich mich durch die Foren um meine Anfängerprobleme zu lösen aber dieses mal habe ich bisher einfach keine funktionierende Lösung gefunden...

    Also um was geht es. Ich habe eine iPad App mit SplitviewController Template. Im RootviewController wird wie üblich ein Tableview angezeigt.
    Als Datenbasis sollen zwei Arrays dienen, welche ich über einen XMLParser (SyncController) fülle. Leider klappt das nur so halb... Am Ende wird jedenfalls nicht im TableView angezeigt :(

    Im Appdelegate mache ich zunächst den Aufruf für des SyncControllers, der die Daten vom Server holt und dann verarbeitet:

    Quellcode

    1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. // Override point for customization after application launch.
    4. // Add the split view controller's view to the window and display.
    5. self.window.rootViewController = self.splitViewController;
    6. [self.window makeKeyAndVisible];
    7. syncController = [[SyncController alloc] init];
    8. [syncController syncData];
    9. return YES;
    10. }
    Alles anzeigen


    Der Aufruf klappt und die Verarbeitung innerhalb des SyncControllers klappt auch, am Ende habe ich zumindest meine Instanzvariablen (zwei NSMutableArrays) gefüllt.
    Die möchte ich dann an die zwei Instanzvariablen (zwei NSArrays) des RootViewControllers übergeben:

    Quellcode

    1. rootViewController.visitorNames = [[NSArray alloc] initWithArray:self.visitorNames];
    2. rootViewController.visitorCompanies = [[NSArray alloc] initWithArray:self.visitorCompanies];
    3. [rootViewController.tableView reloadData];



    reloadData scheint bis zu - (NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger)section auch zu klappen:

    Quellcode

    1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    2. {
    3. NSLog(@"comp count: %u", [self.visitorCompanies count]);
    4. return [self.visitorCompanies count];
    5. }



    Die Konsole gibt mir zumindest die Richtige Anzahl wieder. Danach wird die Methode - (UITableViewCell *)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath aber nicht aufgerufen...

    Zur Analyse habe ich im RootViewController bei numberOfRowsInSection einen Breakpoint gesetzt um mir die Arrays anzuschaun:


    [Blockierte Grafik: http://img146.imageshack.us/img146/1198/debugo.jpg]

    Uploaded with ImageShack.us

    Die Instanzvariablen scheinen soweit in Ordnung zu sein. Aber unter _dataSource nicht. Das mache ich mit meinen Laienkenntnissen als Grund dafür aus, dass nichts angezeigt wird bzw. cellForRowAtIndexPath nicht aufgerufen wird...
    Ich habe nun schon vieles hin und her probiert, finde aber keine Lösung. Habt ihr eine Idee was da schief läuft?
  • Nein das ist nicht das Problem.

    Wenn numberOfRowsInSection aufgerufen wird, dann wird auch cellForRowAtIndexPath aufgerufen (wenn nicht 0 zurückgeliefert wird). Entweder es werden alle DataSource Methoden aufgerufen oder keine. Schau Dir Dein cellForRowAtIndexPath noch einmal genau an. Eventuell hast du da einen Tippfehler in der Methoden-Definition ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Danke für die schnelle Antwort! Ich reiche die Methode auch noch einmal nach:

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. NSLog(@"testghjgjggjgjggjghjghjghjghjghjghjjhgghj");
    4. static NSString *CellIdentifier = @"Cell";
    5. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    6. if (cell == nil) {
    7. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    8. }
    9. // Configure the cell.
    10. cell.textLabel.text = [self.visitorCompanies objectAtIndex:indexPath.row];
    11. return cell;
    12. }
    Alles anzeigen


    Leider kommt es nie zu meiner Log-Ausgabe. Wie gesagt, die von numbersOfRowsInSection klappt ohne Probleme und liefert mir auch einen erwarteten Wert
    Nur als Info: Wenn ich den SyncController außer Acht lasse, also nicht verwende, und mir mein Array in viewDidLoad: des RootViewControllers mit festen Werten definiere, dann klappt alles ohne Probleme.

    Danke nochmal für die Antwort
  • @ramo ich lade gleich mal die .h und .m Dateien hoch.

    @Claus

    das sind die Properties:

    Quellcode

    1. @property (nonatomic, retain) NSArray *visitorCompanies;
    2. @property (nonatomic, retain) NSArray *visitorNames;

    Das habe ich mal gemacht und dann hat es auch geklappt. Das Problem scheint also mit dem SyncController zu tun haben.

    Danke!

    Update:
    Im Anhang ist der Code. Bitte nicht soviel lachen und schimpfen, bin ja noch Anfänger und denke mal dass es mit der Zeit dann besser wird.
    Generell handelt es sich hierbei nur um ein internes Projekt.

    Update2:
    Hab im SyncController nochmal kurz was angepasst. Daher ein neuer Anhang.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Mceee ()

  • Im SyncController als Test eingefügt.

    Quellcode

    1. self.visitorNames = [[NSMutableArray alloc] initWithObjects:@"A", @"B", @"C", nil];
    2. self.visitorCompanies = [[NSMutableArray alloc] initWithObjects:@"Com1", @"Com2", @"Com3", nil];
    3. // Dies hier entfernt.
    4. // rootViewController.visitorNames = [[NSArray alloc] initWithArray:self.visitorNames];
    5. // rootViewController.visitorCompanies = [[NSArray alloc] initWithArray:self.visitorCompanies];
    6. // [rootViewController.tableView reloadData];
    7. // Im AppDelegate eingefügt.
    8. syncController = [[SyncController alloc] init];
    9. [syncController syncData];
    10. self.rootViewController.visitorNames = [NSArray arrayWithArray:[syncController visitorNames]];
    11. self.rootViewController.visitorCompanies = [NSArray arrayWithArray:[syncController visitorCompanies]];
    12. [self.rootViewController.tableView reloadData];
    13. [syncController release];
    Alles anzeigen


    Das Problem ist deine "Connection" ! Bist du sicher dass die URL stimmt, ich glaube nicht ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ramo ()

  • Hehe, das ist ne interne URL. Ich kann das nur über ein VPN testen... hätte ich wohl dazu sagen sollen...
    ABER trotzdem vielen vielen Dank. Dein Code-Posting hat mich auf den richtigen Weg gebracht!

    Folgende Lösung nun:

    Quellcode

    1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    2. {
    3. // Override point for customization after application launch.
    4. // Add the split view controller's view to the window and display.
    5. self.window.rootViewController = self.splitViewController;
    6. [self.window makeKeyAndVisible];
    7. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSaved:)name:@"DataSaved" object:nil];
    8. syncController = [[SyncController alloc] init];
    9. [syncController syncData];
    10. return YES;
    11. }
    Alles anzeigen



    Am Ende der XML-Verarbeitung im syncController:

    Quellcode

    1. [[NSNotificationCenter defaultCenter] postNotificationName:@"DataSaved" object:nil];



    Im AppDelegate:

    Quellcode

    1. - (void) dataSaved:(NSNotification *)notification{
    2. self.rootViewController.visitorNames = [NSArray arrayWithArray:[syncController visitorNames]];
    3. self.rootViewController.visitorCompanies = [NSArray arrayWithArray:[syncController visitorCompanies]];
    4. [self.rootViewController.tableView reloadData];
    5. [syncController release];
    6. }




    Nun klappt alles. Das Problem war scheinbar das Setzen der Arrays im RootViewController aus dem syncController heraus.
    Noch einmal vielen Dank!