Daten von TableView an DetailView übergeben - didSelectRowAtIndexPath (Daten kommen verspätet an?)

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

  • Daten von TableView an DetailView übergeben - didSelectRowAtIndexPath (Daten kommen verspätet an?)

    Hallo zusammen,

    Von einem TableView sollen Daten (ein Array) an den DetailView übergeben werden! Dies funktioniert nur so halb *g*
    Die Daten kommen zwar an, aber leider "verspätet"! 8| D.h. diese sind nicht bei viewDidLoad vorhanden, sondern erst bei der "- (void)setDetailItem:(id)newDetailItem" siehe unten.

    Dies ist in der pvViewController.m (TableView)

    Quellcode

    1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    2. {
    3. NSDictionary *item = [sectionData objectAtIndex:[indexPath section]];
    4. NSArray* sectionEntries = [item objectForKey:@"data"];
    5. pvDetailViewController *detailVC = [[pvDetailViewController alloc] init];
    6. detailVC.detailItem = [sectionEntries objectAtIndex:[indexPath row]];
    7. }


    Die Property hab ich in der DetailView eingebaut (pvDetailViewController.h)

    Quellcode

    1. ...
    2. @property (retain, nonatomic) NSDictionary *detailItem;
    3. ...


    Hier die pvDetailViewController.m Datei:

    Quellcode

    1. ...
    2. @synthesize detailItem;
    3. - (void)setDetailItem:(id)newDetailItem
    4. {
    5. if (detailItem != newDetailItem) {
    6. detailItem = newDetailItem;
    7. NSLog(@"setDetailItem => %@", detailItem);
    8. }
    9. }
    10. // returns => "setDetailItem => { "feld1" = "inhalt" }"
    11. - (void)viewDidLoad
    12. {
    13. [super viewDidLoad];
    14. NSLog(@"viewDidLoad => %@", detailItem);
    15. }
    16. // returns => "viewDidLoad => (null)"
    Alles anzeigen


    Andere Themen habe ich schon durchforstet, aber nichts gefunden das mir weiter hilft (wie zB: Label an andere Datetein übergeben )
  • Wiso schreibst Du den Setter selber wenn du synthesize verwendest ?

    Wo zeigst du den Detailview denn an ? In seinem eigenen Alloc/Init ? Dann ist ja wohl logisch, das erst viewDidLoad aufgerufen wird und dann dein (überflüssiges) setDetailItem.

    Nur zum Verständnis: Sehe ich das richtig, dass Du ein Array of Dictionaries hast in dem unter einem einem Key ein Array ist, welches ein Array enthält ???

    Starker Tobak. Kapierst Du das selber noch ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • das ist ja schnell gegangen mit einer Antwort! :thumbup:
    Wo zeigst du den Detailview denn an ? In seinem eigenen Alloc/Init ?
    Dann ist ja wohl logisch, das erst viewDidLoad aufgerufen wird und dann
    dein (überflüssiges) setDetailItem.
    hmm, ich verwende das Storyboard und es is miteinander verknüpft (wenn ich das so beschreiben kann?!)
    Der wechsel von der TableView zur DetailView klappt.
    Das viewDidLoad als erstes aufgerufen wird klingt eh logisch, nur warum ist dann detailItem nicht verfügbar? Ich versteh den Zusammenhang nicht wirklich.

    Wiso schreibst Du den Setter selber wenn du synthesize verwendest ?
    Weil ich schon am verzweifeln war *g*
    Bin neu in der Materie und probier alles aus.

    Nur zum Verständnis: Sehe ich das richtig, dass Du ein Array of
    Dictionaries hast in dem unter einem einem Key ein Array ist, welches
    ein Array enthält ???
    ja das Funktioniert eigentlich bereits. Wird dann vermutlich ein Associative array enthalten.

    Starker Tobak. Kapierst Du das selber noch ?
    derzeit nicht mehr :-/
  • Ich kenne mich mit dem Storyboard nicht wirklich aus, aber ich nehme mal an, dass der Detailview bereits angezeigt wird nachdem er sein init bekommen hat. Also würde dann auch der viewDidLoad, viewWillAppear etc aufgerufen und erst danach würde deine Property gesetzt. Mach doch einfach mal einen Breakpunkt in die didSelectRowAtIndexPath und die viewDidLoad und geh in Einzelsteps durch. Dann siehst du ja wann was aufgerufen wird.

    Also abhilfe (geht aber bestimmt auch einfacher, must halt warten bis MAcMoonshine wach ist :) ) würde ich einen eigenen InitWithItem im DetailViewController schreiben, diesen in didSelect… benutzen und dort dann die Property setzen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Michael schrieb:

    Dann solltest Du auch die für das Storyboard vorgesehenen Mechanismen verwenden. Die Daten für den DetailView übergibst Du in der Methode prepareForSegue:sender:. Die Methode tableView:didSelectRowAtIndexPath: brauchst Du bei Storyboards für den Viewwechsel nicht.
    Ok, ich verstehe! Habs auch schon hinbekommen
    Jetzt sind die Daten auch im viewDidLoad verfügbar!

    Vielen Dank!

    Quellcode

    1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    2. {
    3. if ([[segue identifier] isEqualToString:@"showDetail"]) {
    4. NSIndexPath *indexPath = [tabler indexPathForSelectedRow];
    5. NSDictionary *items = [sectionData objectAtIndex:[indexPath section]];
    6. NSArray* sectionEntries = [items objectForKey:@"data"];
    7. NSArray * item = [sectionEntries objectAtIndex:[indexPath row]];
    8. [[segue destinationViewController] setDetailItem:item];
    9. }
    10. }
    Alles anzeigen