Selektierten Dateinamen anzeigen lassen

  • michael m. schrieb:

    Michael schrieb:

    Du zugreifen willst: 18446744073709551615
    Ja das leuchtet mir ein, ich weiss nur nicht warum der Zugriffsindex so hoch ist?

    Ohne nachgesehen zu haben: NSNotFound.

    Wobei das bei mir nur 9223372036854775807 ist, also die Hälfte.
    «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
  • michael m. schrieb:

    Michael schrieb:

    Du zugreifen willst: 18446744073709551615
    Ja das leuchtet mir ein, ich weiss nur nicht warum der Zugriffsindex so hoch ist?

    Eigentlich ist der gar nicht so hoch, sondern der ist sogar recht klein. Nur die Ausgabe des Debuggers macht den so groß, weil der Debugger der Wert als "unsigned" interpretiert. Wenn Du diese große Zahl mal in Binärdarstellung umwandelst, bekommst Du 64 Einsen, was der binären Darstellung der Zahl -1 entspricht. Zusammen mit Mattes' Aussagen sollte Dir nun ein Licht aufgehen.

    Michael
  • Hi Mattes,

    also ich habe die Prüfung jetzt mal gemacht und festgestellt, das -1 heraus kommt.

    Quellcode

    1. // Füllen des Arrays mit den Objekten aus dem Verzeichnis "fileDirectoryPath".
    2. self.dataArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    3. // Anzahl der Arrayinhalte feststellen
    4. int arrayAnzahl = [dataArray count];
    5. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    6. int dateiZeile = [outTableView selectedRow];
    7. // Wenn der Zugriff ausserhalb des Array Bereichs liegt, dann auf erstes Element setzen
    8. if (dateiZeile > arrayAnzahl) { dateiZeile = 0; }
    9. NSLog (@"Arrax Inhalt: %@", self.dataArray);
    10. NSLog (@"Array Anzahl: %i", arrayAnzahl); // Anzahl ist 13
    11. NSLog(@"Selektierte Zeile: %i", dateiZeile); // Ergebnis ist -1
    Alles anzeigen



    Manchmal, ziemlich oft weiss ich nicht wo ich genau nachsehen muss!
    FileManager, TableView, oder bei Array.
    Ich denke, das ist eine Frage der Zeit und der Gewöhnung, wie das ganze funktioniert.


    Also mit -1 bedeutet, das kein Element ausgewählt wurde und meine Prüfung mal wieder nicht
    das richtige war. :huh:


    M.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von michael m. ()

  • Michael schrieb:

    michael m. schrieb:

    Michael schrieb:

    Du zugreifen willst: 18446744073709551615
    Ja das leuchtet mir ein, ich weiss nur nicht warum der Zugriffsindex so hoch ist?

    Eigentlich ist der gar nicht so hoch, sondern der ist sogar recht klein. Nur die Ausgabe des Debuggers macht den so groß, weil der Debugger der Wert als "unsigned" interpretiert.

    NSNotFound ist als Unsigned Long definiert. Weiß Apple wieso.
    «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
  • also wenn ich das Programm starte, dann habe ich ja überhaupt keine Möglichkeiten eine Datei aus zu wählen.
    Denn das Fenster wird schon mit dem TableView angezeigt.

    In diesem Fall, beim Programmstart habe ich dann entschieden, direkt das erste Element anzeigen zu lassen.

    Quellcode

    1. // Wenn kein Objekt ausgewählt wurde dann auf das erste Element
    2. if (dateiZeile = -1) { dateiZeile = 0; }


    So, das funktioniert erst mal.

    Die Frage ist jetzt.

    Wenn ich dann eine andere Datei selektiere, muss dann auch der andere Name in das Textfield.
    Dann müsste ich die Methode jetzt nicht mehr in der "awakeFromNib" Methode com Controller
    implentieren, sondern in der AppDelegate?

    M.
  • Thallius schrieb:

    Warum selektierst du nicht einfach dann auch die erste Zeile im TableView statt so einen Fusch zu fabrizieren ?

    Weil es zu Programmstart zunächst keine erste Zeile gibt. Steht doch da. :P

    Warum gibt es zu Programmstart keine erste Zeile? Bindings kapott oder DataSource fehlerhaft.
    Warum sind die Bindings kapott/ist die DataSource fehlerhaft? Das Einsteigerbuch taugt nix.
    Warum taugt das Einsteigerbuch nix? Es ist zum Leser inkompatibel.
    «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
  • Lucas de Vil schrieb:

    Mag sein, aber.

    Da ich die IDE öfter nutze als die Dokumentation höre ich natürlich zunächst auf diese.

    Weil du auf 64 Bit kompilierst. NSNotFound ist als NSIntegerMax definiert. Bei 64 Bit ist das "zufällig" long.
    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"?
  • Die Abfrage, ob es eine Selektion gibt, wenn ich diese nutzen möchte, ist übrigens kein Pfusch. Es kann aus gefühlten 23498723947239847 Gründen so sein, dass gerade keine Selektion existiert.
    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"?
  • Tja was soll ich sagen, das Einsteigerhandbuch war eigentlich ganz gut, aber mit dem was ich hier mache, steht da leider nichts drin.
    Auch in anderen Büchern habe ich weder etwas über NSFileManger gelesen, noch nach dem Verfahren wie man vorgehen muss, um
    selektierte Inhalte in anderen Komponenten anzeigen zu lassen.

    Lange habe ich gebraucht um zu verstehen was ich für dieses Vorhaben überhaupt benötige!
    NSTableView?, NSBrowser?, NSFileManager?, .....

    Das reime ich mir in etwas zusammen mit Hilfe von Euch und der Apple Dokumentation.
    Wenn ich das spielend können würde, dann hätte ich vielleicht nicht so viele dumme Fragen.

    M.
  • Amin Negm-Awad schrieb:

    Die Abfrage, ob es eine Selektion gibt, wenn ich diese nutzen möchte, ist übrigens kein Pfusch. Es kann aus gefühlten 23498723947239847 Gründen so sein, dass gerade keine Selektion existiert.


    Habe ich auch nie behauptet. Futsch ist es aber einfach irgendwelche Daten ( in diesem fall die bei Index 0) nehmen wenn gar keine selektiert sind nur weil man anscheinend nicht so programmieren kann, das die software auch ohne Selektion ein vernünftiges Ergebnis liefert bzw anzeigt oder eben auch nichts anzeigt...

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • michael m. schrieb:

    Tja was soll ich sagen, das Einsteigerhandbuch war eigentlich ganz gut, aber mit dem was ich hier mache, steht da leider nichts drin.
    Auch in anderen Büchern habe ich weder etwas über NSFileManger gelesen, noch nach dem Verfahren wie man vorgehen muss, um
    selektierte Inhalte in anderen Komponenten anzeigen zu lassen.

    Lange habe ich gebraucht um zu verstehen was ich für dieses Vorhaben überhaupt benötige!
    NSTableView?, NSBrowser?, NSFileManager?, .....

    Das reime ich mir in etwas zusammen mit Hilfe von Euch und der Apple Dokumentation.
    Wenn ich das spielend können würde, dann hätte ich vielleicht nicht so viele dumme Fragen.

    M.

    Das hat nichts mit NSFileManager zu tun. Du musst auch nicht lange suchen. Es geht ausschließlich um die Dokumentation der von dir benutzten Methode.
    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"?
  • Ich habe hier einen Code wobei ich nicht genau weiss was in der if und der else Anweisung passiert.

    Quellcode

    1. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    2. {
    3. int dateiZeile;
    4. dateiZeile = [outTableView selectedRow];
    5. if(dateiZeile == -1)
    6. {
    7. do stuff for the no-rows-selected case
    8. }
    9. else
    10. {
    11. do stuff for the selected dateiZeile
    12. }
    13. }
    Alles anzeigen


    Meldung: Use of undeclared identifier "stuff"

    Die Methode sollte im Textfield den selektierten Dateinamen im TextField anzeigen.

    Es wäre sehr nett, wenn mir jemand

    Quellcode

    1. do stuff for the no-rows-selected case


    und

    Quellcode

    1. do stuff for the selected dateiZeile


    erklären könnte.
    Ich habe in der Doku schon nachgeschaut, konnte aber nichts passendes finden über
    stuff, no-rows-selected.

    Vielen Dank

    M.
  • In der "If.." solltest du das machen wenn keine Zeile selektiert ist und in "else . ." wenn eine Zeile (dateiZeile = row) selektiert wurde.

    Quellcode

    1. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    2. {
    3. int dateiZeile;
    4. dateiZeile = [outTableView selectedRow];
    5. if(dateiZeile == -1)
    6. {
    7. self.theTextField.text = @"Nichts gewählt !";
    8. }
    9. else
    10. {
    11. self.theTextField.text = [NSString stringWithFormat:@"Selektierte Zeile = %i", dateiZeile];
    12. }
    13. }
    Alles anzeigen



    "do stuff for the no-rows-selected case", das sind nur Kommentare !
  • Vielen Dank,

    nach Durchsicht des aktuellen Codes sind mir Codedopplungen aufgefallen und das NSTextField zeigt immer noch nicht den selektierten Text an.

    Quellcode

    1. #import "fileManagerController.h"
    2. // Spaltenidentifier für Dateinamen
    3. NSString *const spaltenIdent = @"Dateinamen";
    4. // Verzeichnispfad auf dem NAS System
    5. NSString *const fileDirectoryPath = @"/Volumes/Daten-Dokumente/DM Scans";
    6. @implementation fileManagerController
    7. // Methodeninitialisierung für Get und Set
    8. @synthesize outTableView;
    9. @synthesize dataArray;
    10. @synthesize tfDateiName;
    11. -(void)awakeFromNib
    12. {
    13. [super awakeFromNib];
    14. NSArray* columns = [self.outTableView tableColumns];
    15. [[columns objectAtIndex:0] setIdentifier:spaltenIdent];
    16. // Array mit den Inhalten der Objekte im Verzeichnis füllen
    17. self.dataArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    18. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    19. NSInteger dateiZeile = [outTableView selectedRow];
    20. // Wenn kein Objekt ausgewählt wurde dann auf das erste Element verweisen
    21. if (dateiZeile == -1) { dateiZeile = 0; }
    22. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    23. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];
    24. // Anzeigen des Dateinamens aus der Array Liste von der ivar name im Outlet "tfDateiName"
    25. [tfDateiName setStringValue:dateiName];
    26. // Erstes Elements selektieren
    27. NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:0];
    28. [outTableView selectRowIndexes:indexSet byExtendingSelection:NO];
    29. }
    30. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    31. {
    32. int dateiZeile;
    33. dateiZeile = [outTableView selectedRow];
    34. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    35. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];
    36. if(dateiZeile == -1)
    37. {
    38. [tfDateiName setStringValue:@"Nichts wurde ausgewählt !"];
    39. }
    40. else
    41. {
    42. tfDateiName = [NSString stringWithFormat:dateiName];
    43. }
    44. }
    45. #pragma mark TableView DataSource
    46. // Ermittelt die Anzahl der Elemente der Dateiliste
    47. - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
    48. {
    49. return self.dataArray.count;
    50. }
    51. // Ermittelt die Spalte mit inhalt
    52. - (id)tableView:(NSTableView *)aTableView
    53. objectValueForTableColumn:(NSTableColumn *)aTableColumn
    54. row:(NSInteger)rowIndex
    55. {
    56. if ([[aTableColumn identifier] isEqualToString:spaltenIdent]) {
    57. return [self.dataArray objectAtIndex:rowIndex];
    58. }
    59. }
    60. @end
    Alles anzeigen



    Die Variablen in "awakeFromNib" werden nicht in der Methode "tableViewSelectionDidChange" gefunden, also stellt sich mir die Frage.
    Der Controller läuft doch solange bis das Programm beendet wurde und reagiert auf Benutzereingaben.
    Trifft das für alle Methoden in der Klasse zu?
    Läuft die Methode awakeFromNib nur einmal durch?

    Ich tue mich da noch ein bisschen schwer mit der Implementierung in den richtigen Methodengruppen zuzuordnen!

    Der aktuelle Code sieht nun so aus.

    Quellcode

    1. #import "fileManagerController.h"
    2. // Spaltenidentifier für Dateinamen
    3. NSString *const spaltenIdent = @"Dateinamen";
    4. // Verzeichnispfad auf dem NAS System
    5. NSString *const fileDirectoryPath = @"/Volumes/Daten-Dokumente/DM Scans";
    6. @implementation fileManagerController
    7. // Methodeninitialisierung für Get und Set
    8. @synthesize outTableView;
    9. @synthesize dataArray;
    10. @synthesize tfDateiName;
    11. -(void)awakeFromNib
    12. {
    13. [super awakeFromNib];
    14. NSArray *columns = [self.outTableView tableColumns];
    15. [[columns objectAtIndex:0] setIdentifier:spaltenIdent];
    16. // Array mit den Inhalten der Objekte im Verzeichnis füllen
    17. self.dataArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    18. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    19. NSInteger dateiZeile = [outTableView selectedRow];
    20. // Prüfen ob ein Objekt selektiert ist
    21. if (dateiZeile == -1)
    22. {
    23. // Wenn kein Objekt ausgewählt wurde dann auf das erste Element verweisen
    24. dateiZeile = 0;
    25. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    26. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];
    27. // Erstes Elements selektieren
    28. NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:0];
    29. [outTableView selectRowIndexes:indexSet byExtendingSelection:NO];
    30. // Anzeigen des Dateinamens aus der Array Liste von der ivar name im Outlet "tfDateiName"
    31. [tfDateiName setStringValue:dateiName];
    32. }
    33. }
    34. /*
    35. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    36. {
    37. }
    38. */
    39. #pragma mark TableView DataSource
    40. // Ermittelt die Anzahl der Elemente der Dateiliste
    41. - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
    42. {
    43. return self.dataArray.count;
    44. }
    45. // Ermittelt die Spalte mit inhalt
    46. - (id)tableView:(NSTableView *)aTableView
    47. objectValueForTableColumn:(NSTableColumn *)aTableColumn
    48. row:(NSInteger)rowIndex
    49. {
    50. if ([[aTableColumn identifier] isEqualToString:spaltenIdent])
    51. {
    52. return [self.dataArray objectAtIndex:rowIndex];
    53. }
    54. }
    55. @end
    Alles anzeigen



    In der awakeFromNib Methode ist jetzt alles drin was man benötigt, wenn das Programm zum ersten mal gestartet wird.
    Es kann keine Selektion beim ersten Programmstart erfolgen und daher wird alles auf das erste Objekt gesetzt.
    Das anzeigen des TextFields auf das erste Objekt und die Selektion in der TableViewLeiste.

    Um das aktualisieren des TextFieldes durch die Auswahl im TableView dann eine erneute Methode schreiben, die dann
    darauf schaut ob sich da etwas verändert hat?

    Das würde dann in etwas gleich aussehen wie in der awake FromNob mit dem unterschied das es einen Else Zweig gibt.

    Also habe ich das ganze dann in die tableViewSelectionDidChange umgelagert so wie hier

    Quellcode

    1. -(void)awakeFromNib
    2. {
    3. [super awakeFromNib];
    4. NSArray *columns = [self.outTableView tableColumns];
    5. [[columns objectAtIndex:0] setIdentifier:spaltenIdent];
    6. // Array mit den Inhalten der Objekte im Verzeichnis füllen
    7. self.dataArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    8. }
    9. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
    10. {
    11. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    12. NSInteger dateiZeile = [outTableView selectedRow];
    13. // Prüfen ob ein Objekt selektiert ist
    14. if (dateiZeile == -1)
    15. {
    16. // Wenn kein Objekt ausgewählt wurde dann auf das erste Element verweisen
    17. dateiZeile = 0;
    18. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    19. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];
    20. // Erstes Elements selektieren
    21. NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:0];
    22. [outTableView selectRowIndexes:indexSet byExtendingSelection:NO];
    23. // Anzeigen des Dateinamens aus der Array Liste von der ivar name im Outlet "tfDateiName"
    24. [tfDateiName setStringValue:dateiName];
    25. }
    26. }
    Alles anzeigen


    und siehe da nix ging mehr.

    Sieht so aus als wenn die Methode tableViewSelectionDidChange nicht ausgeführt wird?

    M.