Selektierten Dateinamen anzeigen lassen

  • Selektierten Dateinamen anzeigen lassen

    Hallo,

    mittlerweile habe ich es geschafft mit dem NSFileManager in einem TableView die Dateien eines Ordners anzeigen zu lassen.

    Zur Zeit sieht es so aus, das ich eine Klasse Dokument und DateiListeController.
    Der DateiListeController erbt von der Klasse Dokument, damit auch auf die Methoden und Instanzvariablen zugegriffen werden
    können.

    Der aktuelle Codeschnipsel um den es geht (Klasse "DateiListeController.m) sieht so aus:

    Quellcode

    1. self.arrayDateiListe = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    2. self.name = [outDateiListe selectedRow]; // Der selektierte Dateiname wird in die ivar name geschrieben.
    3. [nameTextField setStringValue:self.name]; // der Inhalt der ivar name soll in das TextField der Oberfläche ausgegeben werden.

    Die Instanzvariable "self.name" ist aus der Klasse und scheinbar gibt es dort kein Problem.
    Das Problem ist "nameTextField", das im IB ein TextField beherbergt und zwar das in dem die ivar name aus Dokument hinein kommt.
    Xcode würde das gerne verbessern und schlägt mir NSTextField vor, was ja nicht richtig wäre.

    Das Textfeld hat keinen Identifizier, die Verbindung wurde aus der Datei AppDelegate.m vom Kreis mit der Zeile


    Quellcode

    1. @property (assign) IBOutlet NSTextField *nameTextField;

    auf das TextField gezogen, und die Verbindung wurde dann durch einen gefüllten Kreis angezeigt.


    Muss ich da noch irgendwo ein Verbindung ziehen?

    Danke

    M.
  • self.nameTextField hatte ich auch schon probiert, da bekomme ich die Meldung:
    Property 'nameTextField' not found on object of type 'DateiListeController *.


    och da kommt gerade ein gelbes Dreieck in der Zeile

    Quellcode

    1. self.name = [outDateiListe selectedRow];

    Da ist ebenfalls wohl ein Problem. Anscheinend gibt selectes Row einen integer Wert zurück!
    Incompatible integer to pointer conversion assigning to NSString *from NSInteger (aka long)

    Gut, wenn ich das korrigiere, ist dann vielleicht auch der Fehler mit dem TextField weg.

    M.
  • AppDlegate.h

    Quellcode

    1. @property (assign) IBOutlet NSTextField *nameTextField;


    Appdelegate.m

    Quellcode

    1. @synthesize nameTextField;



    Dokument.h

    Quellcode

    1. @property (assign) NSString *name; // Dokumentname ohne Pfad



    Dokument.m

    Quellcode

    1. @synthesize name;



    M.
  • Ich habe den Codeschnipesel wie folgt abgeändert.

    Quellcode

    1. self.arrayDateiListe = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    2. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    3. NSInteger dateiZeile = [outDateiListe selectedRow];
    4. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    5. NSString *dateiName = [arrayDateiListe objectAtIndex:dateiZeile];
    6. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    7. self.name = dateiName;
    8. [nameTextField setStringValue:self.name]; // Unknown receiver "nameTextField".



    Aber leider ist "nameTextField"


    Unknown receiver "nameTextField".

    M.
  • Wenn du das TextField im AppDelegate definierst, wie soll es denn dann in der Klasse DateilisteController vorhanden sein ?

    und bekommst du bei

    Quellcode

    1. self.name = [outDateiListe selectedRow];


    wirklich keinen Warning ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ok, ja ich sitze vielleicht schon zu lange vor dem Mac :)


    [nameTextField setStringValue:self.name]; // Unknown receiver "nameTextField".

    Wird im "TableViewController" gemacht.


    Wenn das bedeutet, das der reload im AppDelegate gemacht werden muss?

    Ist dann die Überlegung richtig, im "DateiListeController" das selektieren der Datei in die ivar name
    zu schreiben und im AppDelegate den Bildschirm neu auf zu bauen?

    Das würde aber bedeuten, das man dann eine Methode Refresh erstellen müsste und die durch einen
    button aus zu lösen.

    Das wäre aber nicht sinnvoll, oder muss so etwas andersgemacht werden ?


    Oder ich glaub ich brauch mal ne Pause :wacko:

    M.
  • So, also noch mal in Ruhe überlegt.

    Die Controller Klasse kann auf die Instanzvariablen von der Klasse Dokument zugreifen und auch auf das TableView der xib Datei, sonst
    wäre das TableView it der Dateiliste leer.

    Dann sollte es auch möglich sein von der Controller Klasse auf das TextField zugreife zu können.
    Demnach sollten die Methoden am richtigen Ort sein.
    Vielleicht ist es ja doch möglich, das vielleicht eine Verbindung fehlt, die noch durch das ziehen gemacht werden muss?

    Definitiv sagt die Fehlermeldung aus, das der Empfänger des TextField nicht da ist.

    M.
  • Hi,

    das Programm stoppt an der Zeile

    Quellcode

    1. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];


    Mit der Meldung: Thread 1: signal SIGABRT.

    Ich habe mir den gesamten code mal angeschaut und habe festgestellt, dass ich in dieser
    Zeile objectAtIndex verwendet habe.

    Aber im gesamten Code keine Objekte erstellt habe.

    Code "fileManagerController.h"

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. @interface fileManagerController : NSObject <NSFileManagerDelegate, NSTableViewDataSource>
    3. // Methodendeklarationen für Get und Set
    4. @property (strong) IBOutlet NSTextField *tfDateiname;
    5. @property (assign) IBOutlet NSTableView *outTableView;
    6. @property (strong) NSArray *dataArray;
    7. @end



    Code "fileManagerController.m"

    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/";
    6. @implementation fileManagerController
    7. // Methodeninitialisierung für Get und Set
    8. @synthesize tfDateiname;
    9. @synthesize outTableView;
    10. @synthesize dataArray;
    11. -(void)awakeFromNib
    12. {
    13. [super awakeFromNib];
    14. NSArray* columns = [self.outTableView tableColumns];
    15. [[columns objectAtIndex:0] setIdentifier:spaltenIdent];
    16. self.dataArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:fileDirectoryPath error:nil];
    17. // Zeilennumer des selktierten Dateinamen in die Variable dateiZeile zurückgeben
    18. NSInteger dateiZeile = [outTableView selectedRow];
    19. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    20. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];
    21. // Speichern des Dateinamens aus der Array Liste in in die ivar name
    22. [tfDateiname setStringValue:dateiName];
    23. }
    24. #pragma mark TableView DataSource
    25. // Ermittelt die Anzahl der Elemente der Dateiliste
    26. - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
    27. {
    28. return self.dataArray.count;
    29. }
    30. // Ermittelt die Spalte mit Inhalt
    31. - (id)tableView:(NSTableView *)aTableView
    32. objectValueForTableColumn:(NSTableColumn *)aTableColumn
    33. row:(NSInteger)rowIndex
    34. {
    35. if ([[aTableColumn identifier] isEqualToString:spaltenIdent])
    36. {
    37. return [self.dataArray objectAtIndex:rowIndex];
    38. }
    39. }
    40. @end
    Alles anzeigen


    Code "AppDelegate.h"

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. #import "fileManagerController.h"
    3. @interface AppDelegate : NSObject <NSApplicationDelegate>
    4. @property (assign) IBOutlet NSWindow *window;
    5. @end


    Code "AppDelegate.m"

    Quellcode

    1. #import "AppDelegate.h"
    2. @implementation AppDelegate
    3. @synthesize window = _window;
    4. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    5. {
    6. // Insert code here to initialize your application
    7. }
    8. @end
    Alles anzeigen


    Muss ich jetzt doch noch Objekte erzeugen, oder kann ich das ganze weiter über Properties
    machen?

    Kann mir da jemand helfen, wie das doch noch funktionieren kann?

    Vielen Dank

    M.
  • michael m. schrieb:

    Quellcode

    1. NSInteger dateiZeile = [outTableView selectedRow];
    2. NSString *dateiName = [dataArray objectAtIndex:dateiZeile];

    Ich habe mir jetzt nicht Deinen ganzen Code durchgelesen und versucht, ihn nachzuvollziehen (ehrlich gesagt habe ich auch keine Lust dazu), mir fallen nur die o. g. Zeilen in's Auge: Gibt es einen Grund, warum Du dateiZeile nicht prüfst? In einer TableView muss nicht zwingend eine Zeile selektiert sein. Ich weiss jetzt auswendig nicht, was selectedRow in diesem Fall liefert (NSNotFound?), aber ich könnte mir vorstellen, dass Dein Array dann ein Problem beim Zugriff bekommt...

    Nur laut gedacht, weil momentan ohne Mac, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo

    also hier kommt folgendes raus:

    ramo schrieb:

    NSLog (@"%@", self.dataArray);
    Ergebnis:

    Quellcode

    1. "2012_05_22_15_17_17.pdf","Chefkoch.de Rezept: Paprikanudeln mit Lachs.pdf","2012_04_19_12_06_03.pdf","2012_03_08_07_10_59.pdf","Kiwi Milchshake.pdf",".DS_Store","2012_05_22_06_37_54.pdf","2012_05_24_07_21_29.pdf","2012_05_30_14_24_41.pdf","Auftrag City Glaserei.pdf","Bananen - Orangenmilch.pdf","2012_05_22_06_37_59.pdf","Chefkoch.de Rezept: Clints Chili con Carne.pdf"




    Sobald ich fogende Zeile einefüge


    Quellcode

    1. NSLog (@"%@", [self.dataArray objectAtIndex:dateiZeile]);



    erhalte ich folgendes:

    Quellcode

    1. )
    2. 2012-07-05 10:31:00.819 File Manager[45318:403] An uncaught exception was raised
    3. 2012-07-05 10:31:00.819 File Manager[45318:403] *** -[__NSArrayM objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 12]
    4. 2012-07-05 10:31:00.820 File Manager[45318:403] (
    5. 0 CoreFoundation 0x00007fff989aaf56 __exceptionPreprocess + 198
    6. 1 libobjc.A.dylib 0x00007fff90e0ed5e objc_exception_throw + 43
    7. 2 CoreFoundation 0x00007fff98938392 -[__NSArrayM objectAtIndex:] + 274
    8. 3 File Manager 0x000000010be54406 -[fileManagerController awakeFromNib] + 486
    9. 4 CoreFoundation 0x00007fff989a1fb1 -[NSObject performSelector:] + 49
    10. 5 CoreFoundation 0x00007fff989a1f32 -[NSSet makeObjectsPerformSelector:] + 274
    11. 6 AppKit 0x00007fff979d19ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
    12. 7 AppKit 0x00007fff979c7f73 loadNib + 322
    13. 8 AppKit 0x00007fff979c7470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
    14. 9 AppKit 0x00007fff979c738b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
    15. 10 AppKit 0x00007fff979c72ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
    16. 11 AppKit 0x00007fff97c3806f NSApplicationMain + 398
    17. 12 File Manager 0x000000010be54182 main + 34
    18. 13 File Manager 0x000000010be54154 start + 52
    19. 14 ??? 0x0000000000000003 0x0 + 3
    20. )
    21. 2012-07-05 10:31:00.822 File Manager[45318:403] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 12]'
    22. *** First throw call stack:
    23. (
    24. 0 CoreFoundation 0x00007fff989aaf56 __exceptionPreprocess + 198
    25. 1 libobjc.A.dylib 0x00007fff90e0ed5e objc_exception_throw + 43
    26. 2 CoreFoundation 0x00007fff98938392 -[__NSArrayM objectAtIndex:] + 274
    27. 3 File Manager 0x000000010be54406 -[fileManagerController awakeFromNib] + 486
    28. 4 CoreFoundation 0x00007fff989a1fb1 -[NSObject performSelector:] + 49
    29. 5 CoreFoundation 0x00007fff989a1f32 -[NSSet makeObjectsPerformSelector:] + 274
    30. 6 AppKit 0x00007fff979d19ff -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
    31. 7 AppKit 0x00007fff979c7f73 loadNib + 322
    32. 8 AppKit 0x00007fff979c7470 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
    33. 9 AppKit 0x00007fff979c738b +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
    34. 10 AppKit 0x00007fff979c72ce +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
    35. 11 AppKit 0x00007fff97c3806f NSApplicationMain + 398
    36. 12 File Manager 0x000000010be54182 main + 34
    37. 13 File Manager 0x000000010be54154 start + 52
    38. 14 ??? 0x0000000000000003 0x0 + 3
    39. )
    40. terminate called throwing an exception(lldb)
    Alles anzeigen



    Also ich denke das es sich um den Zugriff des Objektes handelt, wo es keine Objekte gibt.
    "objectAtIndex"

    Zumindest ist mir im Code nicht aufgefallen, da sich Objekte erzeugt hatte, das wird's vielleicht sein.
    M.
  • Hi,

    MyMattes schrieb:

    Gibt es einen Grund, warum Du dateiZeile nicht prüfst?
    naja Objective-C ist noch so ziemlich neu und ich lerne halt Schritt für Schritt.
    Mache Tutorials, Lese Bücher und versuche Beispielprojekte nach zu vollziehen und denke mir selbst etwas aus, damit ich auch
    prüfen kann, ob ich es verstanden habe. Man lernt es nicht so schnell, zumindest ich nicht :)

    Ich habe im anderen Beispielen und im Buch etwas über Prüfungen gelesen, das wäre, wenn es gelaufen hätte der nächste Schritt
    gewesen.


    M.
  • Hier steht das Problem:

    Quellcode

    1. 2012-07-05 10:31:00.819 File Manager[45318:403] *** -[__NSArrayM objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 12]

    Dein Array enthält 13 Objekte mit den Indizes 0 bis 12. Und jetzt schau mal auf welchen Index Du zugreifen willst: 18446744073709551615. Siehst Du doch ein, dass das nicht klappen kann, oder? Lies noch mal, was Mattes geschrieben hat.

    Michael
  • michael m. schrieb:

    Ich habe im anderen Beispielen und im Buch etwas über Prüfungen gelesen, das wäre, wenn es gelaufen hätte der nächste Schritt
    gewesen.

    "Keine Ahnung ob die Batterie voll ist. Seh ich ja, wenn ich den Wagen gestartet habe. Aber der springt einfach nicht an!"
    Erst prüfen, dann Funktionalität voraussetzen. ;)
    «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 schrieb:

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

    Das bedeutet ich muss also eine Prüfung machen, damit nur auf die Objekte von 0 bis 12
    zugegriffen werden dürfen.

    Ok, dann werde ich mal machen und melde mich später wieder.

    Danke

    M.
  • michael m. schrieb:

    Ja das leuchtet mir ein, ich weiss nur nicht warum der Zugriffsindex so hoch ist?

    Nochmal ganz deutlich: Lies doch in der Apple-Dokumentation nach, was die Methode selectedRow von NSTableView liefert, wenn keine Zeile selektiert ist ... okay, nun habe ich das für Dich gemacht:

    The index of the last row selected or added to the selection, or –1 if no row is selected.

    Und ... fällt Dir was auf? Also brauchst Du nicht auf die Anzahl der Elemente zu prüfen, sondern schlicht auf ungleich -1, damit Du weisst, dass wirklich eine Zeile ausgewählt war. Und was hat das jetzt mit Objective-C zu tun?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.