Nochmal TableView füllen

  • Nochmal TableView füllen

    Wenn ich die Dokumentationen richtig verstanden habe, dann wird ja ein TableView mittels delegate-Methode mit Objekten gefüllt.

    Nun, solange ich das mit dem Object NSString mache, funktioniert das auch.
    Ich habe mir - einem Tipp aus einem früheren Posting folgend - meine Datenstruktur in ein Objekt gepackt, das wie folgt aussieht :

    Quellcode

    1. Daten : NSObject {
    2. NSString *name[2];
    3. UInt16 index;
    4. struct Conc_rem ConcIndex[12];
    5. BOOL vorhanden;
    6. }

    Ich möchte also mein Objekt erzeugen, durch Einlesen der Datendatei mit Werten füllen, das Objekt in ein NSMutableArray füllen, das dann das TableView füllen soll.

    Quellcode

    1. -(id)tableView:(NSTableView *)liste
    2. objectValueForTableColumn:(NSTableColumn *)aTableColumn
    3. row:(int)row {
    4. Daten *DatenInstanz = [Daten new]
    5. ..... //Daten zuweisen mit Set-Methoden
    6. NSMutableArray *entries = [NSMutableArray new]
    7. [entries addObject:DatenInstanz]
    8. [DatenInstanz release];
    9. return [entries objectAtIndex:row];
    Alles anzeigen


    2 Probleme :
    a) starte ich das Programm bleibt es hängen und ich weiss nicht warum ?(
    b) wie kriege ich "name[0]" bzw "name[1]" als das, was im TableView effektiv angezeigt wird.

    Hans
  • RE: Nochmal TableView füllen

    a), c) Ich ahne, dass dein Programm wegen des C-Arrays hängt. Das führt ja keinen -retain aus. Mehr kann ich aber ohne Fehlermeldung und Soucecode nicht sagen. Bitte etwas über die Speicherverwaltung lesen!

    b) Du bekommst ja mitgeteilt, in welcher Column der abgefragte Wert landen soll. Ist es die linke, nimmst du den einen Namen, ist es die Rechte, nimmst du den anderen Namen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Nochmal TableView füllen

    Als ich mit Cocoa angefangen habe war NSTableView mein erstes Erfolgserlebnis. Ich hatte auch diesselben Probleme, welche allerdings recht schlecht hier im Forum besprochen werden können, da es sich meistens um versteckte kleine fiese Fehler handelt. Meistens sinds Kleinigkeiten. Mach doch einfach mal das Tutorial cocoadev.com/index.pl?NSTableViewTutorial durch und dann fang nochmal an. Lass den C Code doch mal weg und arbeite mit einem richtigen Array, das bsw. Strings enthält.
  • auwei, da stimmt ja so gut wie garnichts.

    das mit dem string-c-array wurde ja schon gesagt.
    Ich glaube aber dass du nicht verstanden hast welchen zweck die DATASOURCE-methonden haben: da geht es darum BESTHENEDE werte einem view zu geben welches danach fragt. Zuerst fragt dich das view wie viele du hast (also in deinem fall wie viele rows) und danch fragt es die werte für jede row ab. Deshalb musst du die werte in der datasource-methode nur noch zurückgeben und nichts erstellen. Und schau dir endlich mal an wie man variablen benennt bzw die groß-kleinschreibung dessen. so fliegst du früher oder später auf die nase (oder einer der mit dir arbeiten muss/will/darf) haut dir eine drauf ;-))
  • Jetzt sei nicht wieder so streng!
    @HansDu musst dir einfach mal angewhnen, OO zu rogrammieren. Es hat keinen Sinn, wenn du Strukturen und Arrays aus C übernimmst. Mutmaßlich hast du lange C gemacht und kennst das so. Aber wenn du vom Auto auf ein Motorrad umsteigst, dann suchst du ja auch nicht als ersten den Anschnallgurt. (Oder gibt es das schon bei Motorrädern?)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Tom9811
    Jetzt sei nicht wieder so streng!
    @HansDu musst dir einfach mal angewhnen, OO zu rogrammieren. Es hat keinen Sinn, wenn du Strukturen und Arrays aus C übernimmst. Mutmaßlich hast du lange C gemacht und kennst das so. Aber wenn du vom Auto auf ein Motorrad umsteigst, dann suchst du ja auch nicht als ersten den Anschnallgurt. (Oder gibt es das schon bei Motorrädern?)


    bmw hat doch solche kugelmotorräder mit gurt und ohne helmpflicht oder irre ich mich?
  • RE: Nochmal TableView füllen

    Original von HansGerber
    Wenn ich die Dokumentationen richtig verstanden habe, dann wird ja ein TableView mittels delegate-Methode mit Objekten gefüllt.


    Falsch verstanden. ;)
    Das TableView wird gar nicht gefüllt, es zeigt Daten an.
    Stichwort MVC. Tom kann dir darüber ein Buch schreiben. +kichert+

    Original von HansGerber
    Nun, solange ich das mit dem Object NSString mache, funktioniert das auch.

    Sehr schön!

    Original von HansGerber
    Ich habe mir - einem Tipp aus einem früheren Posting folgend - meine Datenstruktur in ein Objekt gepackt, das wie folgt aussieht :

    Quellcode

    1. Daten : NSObject {
    2. NSString *name[2];
    3. UInt16 index;
    4. struct Conc_rem ConcIndex[12];
    5. BOOL vorhanden;
    6. }


    Autsch...
    Was mir zuerst auffällt: BOOL vorhanden;
    Da weiß ja keener, was da auf einen zukommt! Eine bestimmte Anzahl vorhanden? An einem bestimmten Ort vorhanden? Ist vorhanden?
    Ich glaube, dass Variablennamen sehr lang werden können.
    Was spricht also gegen BOOL istVorhanden;?
    Spätestens beim Debuggen in Zeile 2487 wirst du dich freuen, das etwas eindeutiger benannt zu haben.

    Dann NSString *name[2];
    Du hast einen Zeiger vom Typ NSString auf ein C-Array...
    Das kann meines Erachtens gar nicht funktionieren.
    Mach da lieber

    Quellcode

    1. Daten : NSObject {
    2. NSString *vorname;
    3. NSString *nachname;
    4. //...
    5. }


    Ob und wie du dein Struct in die Tabelle bekommst weiß ich auch nicht. Mutmaßlich gar nicht, weil die Tabelle eindimensionale Arrays darstellt, ein Struct im Objekt aber schon die zweite Dimension ist.

    gritsch:
    Nein, du irrst dich nicht.
    Aber Autofahrer wie Motorradfahrer finden das Ding gleichermaßen albern und sinnfrei. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Nee, das liegt nicht am String-C-Array, das hängt auch ohne.

    (Die Anmerkung, dass Strukturen und C-Arrays nicht sinnig sind, lasse ich mal so stehen, da habt ihr sicher recht. Im Moment wäre ich aber schon zufrieden, wenn der Code laufen würde - ob optimal geschrieben oder nicht. das Problem ist nur, ich weiss nicht, warum der Code hängt.)

    Ich mache das ganze einfacher (ist zwar unsinnig so , weil ich den NSString direkt nehmen könnte aber darum geht es jetzt ja nicht) :

    Quellcode

    1. Daten : NSObject {
    2. NSString *name;
    3. }


    Der Rest geht wie gehabt : Instanzbildung, Wertezuweisung und Einfügen in ein NSMutableArray. Geht mit NSString-Objekt, geht nicht mit obigem Objekt.

    Meldungen :
    0 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
    1 obj_exception_throw

    @kay : Danke für den Link, werde ich mir gründlich durchlesen
    @gritsch : Ich verspreche Dir, Gross- und Kleinschreibung bei Variablen zu beachten, wenn Du Gross- und Kleinschreibung bei normalen Sätzen verwendest (nee, ist nicht ernst gemeint)
    @Lucas : BOOL vorhanden ist für interne Prozesse wichtig. Damit wird definiert, ob ein Eintrag nur per Name existiert (also leer ist -> vorhanden = false) oder ob effektiv Daten dazu existieren (-> vorhanden = true). Der Eintrag kommt auf jeden Fall in die Liste. Das TableView (ich hab es wahrscheinlich schlecht formuliert) hat nur eine Spalte, also der Inhalt der Variable "name" soll in der Liste erscheinen, sonst nix. Der Struct hat in der List nix verloren.

    Hans
  • sieht dein code immer noch so aus?


    Quellcode

    1. -(id)tableView:(NSTableView *)liste
    2. objectValueForTableColumn:(NSTableColumn *)aTableColumn
    3. row:(int)row {
    4. Daten *DatenInstanz = [Daten new]
    5. ..... //Daten zuweisen mit Set-Methoden
    6. NSMutableArray *entries = [NSMutableArray new]
    7. [entries addObject:DatenInstanz]
    8. [DatenInstanz release];
    9. return [entries objectAtIndex:row];
    Alles anzeigen
  • Original von HansGerber
    Ja, ich habe nur das String C-Array und den Struct aus dem Objekt entfernt um zu verifizieren ob das die Fehlerursache ist, wie vermutet wurde.
    Am (anscheinend immer noch fehlerhaften) Rest wurde nichts verändert.

    Hans


    ich hab ja auch gesagt dass da rein garnichts stimmt!

    in etwa sollte das so aussehen:


    Quellcode

    1. - (id)init
    2. {
    3. ...
    4. _tableViewWerte = [[NSMutableArray alloc] init];
    5. }
    6. - (void)dealloc
    7. {
    8. ....
    9. }
    10. - (int)numberOfRowsInTableView:(id)tv // nur aus dem kopf - die heist aber so in der art
    11. {
    12. return [_tableViewWerte count];
    13. }
    14. -(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)row
    15. {
    16. Data *tmpData = [_tableViewWerte objectAtIndex:row];
    17. if ([[aTableColumn identifier] isEqualToString:@"vorname")
    18. {
    19. return [tmpData vorname]; // oder wie auch immer du da drankomsmt
    20. }
    21. return [tmpData nachname]; // oder wie auch immer du da drankomsmt
    22. }
    Alles anzeigen
  • Original von HansGerber
    Nee, das liegt nicht am String-C-Array, das hängt auch ohne.

    (Die Anmerkung, dass Strukturen und C-Arrays nicht sinnig sind, lasse ich mal so stehen, da habt ihr sicher recht. Im Moment wäre ich aber schon zufrieden, wenn der Code laufen würde - ob optimal geschrieben oder nicht. das Problem ist nur, ich weiss nicht, warum der Code hängt.)

    Ich mache das ganze einfacher (ist zwar unsinnig so , weil ich den NSString direkt nehmen könnte aber darum geht es jetzt ja nicht) :

    Quellcode

    1. Daten : NSObject {
    2. NSString *name;
    3. }


    Der Rest geht wie gehabt : Instanzbildung, Wertezuweisung und Einfügen in ein NSMutableArray. Geht mit NSString-Objekt, geht nicht mit obigem Objekt.

    Meldungen :
    0 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
    1 obj_exception_throw
    […]

    Mach mal Continue im Debugger und schau in dessen Konsole.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von HansGerber
    Bei threads kommt hinzu :
    0 _objc_fatal

    In der Konsole steht :
    objc[1113]: objc_exception_throw failed
    Program received signal: "EXC_BAD_INSTRUCTION"

    Klingt ja richtig übel :(

    Hans


    ises ja auch!
    hast mal meinen samplecode angeschaut (und durchgedacht) und eventuell auch probiert?
  • Hans, ich kann dir leider nichts anderes sagen, als vorhin schon und die anderen: Du fuchtelst mit C-Strukturen herum, ohne dich mit Cocoa auszukennen. Du fuchtelst mit Delegates herum, ohne dich mit Cocoa auszukennen.

    Das hat keinen Sinn. Du wirst nie mit einem Formel-1-Auto fahren können, wenn du nicht wenigstens einmal die erste Fahrstunde nimmst. Und hier bedeutet das mindestens:
    - Speicherverwlatungsregeln
    - Objekterzeugung und Instantierung
    - Sinn und Funktionsweise von Delegates
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von gritsch
    Original von HansGerber
    Ja, ich habe nur das String C-Array und den Struct aus dem Objekt entfernt um zu verifizieren ob das die Fehlerursache ist, wie vermutet wurde.
    Am (anscheinend immer noch fehlerhaften) Rest wurde nichts verändert.

    Hans


    ich hab ja auch gesagt dass da rein garnichts stimmt!

    in etwa sollte das so aussehen:


    Quellcode

    1. - (id)init
    2. {
    3. ...
    4. _tableViewWerte = [[NSMutableArray alloc] init];
    5. }
    6. - (void)dealloc
    7. {
    8. ....
    9. }
    10. - (int)numberOfRowsInTableView:(id)tv // nur aus dem kopf - die heist aber so in der art
    11. {
    12. return [_tableViewWerte count];
    13. }
    14. -(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)row
    15. {
    16. Data *tmpData = [_tableViewWerte objectAtIndex:row];
    17. if ([[aTableColumn identifier] isEqualToString:@"vorname")
    18. {
    19. return [tmpData vorname]; // oder wie auch immer du da drankomsmt
    20. }
    21. return [tmpData nachname]; // oder wie auch immer du da drankomsmt
    22. }
    Alles anzeigen

    *lach* Ich dachte zuerst, dies sei ein Beitrag von Hans und wollte schon "Das sieht dochh gut aus!" schreiben.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?