Verwendung eines eigenen Filebrowsers

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

  • Verwendung eines eigenen Filebrowsers

    Hallo zusammen,

    ich bin Einsteiger, der sich in der Theorie irgendwie ganz akzeptabel vorbereitet fühlt. Sobald ich nun aber etwas erstellen möchte, scheitere ich schlichtweg. Es fällt mir total schwer, Theorie und Praxis zu verknüpfen.

    Ich möchte gerne an einer App üben, die als Filebrowser agiert. Diese Funktion bringt Apple ja quasi mit. Denn schließe ich ein iOS-Gerät an den Mac an, kann ich unter "Apps" in iTunes ja theoretisch meine App auswählen und Dateien oder Ordner per Drag&Drop darin ablegen. Dieser Inhalt soll dann im TableView ausgegeben werden. Sowas ist doch nicht komplex, oder?!

    Mag mich mal jemand durch das Dunkel führen und mich in die richtige Richtung schubsen? ich würde den Inhalt an ein Array übergeben und das dann anschließend an ein UITableView weiterreichen wollen... Ganz am Ende sollen PDF-Dokumente oder klassische Bildformate wie jpg und png geöffnet werden können.

    Bin für Hilfe sehr dankbar! :/
  • Google mal „UITableView File Browser“, dann findest Du auf jeden Fall etwas ... die Stichworte hattest Du ja schon.

    Letztlich nutzt Du den NSFileManager, um Dich durch Dein Documents-Verzeichnis zu hangeln, füllst die UITableView und bei Touch auf eine Zeile öffnest Du entweder die Datei oder pushst den ViewController des Unterordners auf den Navigationstack. Ich habe sowas mal gemacht, wenn Du noch Umbenennen, Verschieben, Kopieren, ... implementieren willst, wird es langsam aufwändig.

    Eine Alternative mag der UIDocumentBrowserViewController sein, es gibt ein entsprechendes Xcode-Template.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich konnte nun so auf den Inhalt des "Documents"-Verzeichnisses kommen:

    Quellcode

    1. let filemanager = FileManager.default
    2. let verzeichnis = filemanager.urls(for: .documentDirectory, in: .userDomainMask)
    3. let dokumentenverzeichnis = verzeichnis[0].path
    4. if filemanager.changeCurrentDirectoryPath(dokumentenverzeichnis) {
    5. // Erfolgreich gefunden
    6. } else {
    7. // Nicht erfolgreich gefunden
    8. }
    9. do {
    10. let ordnerinhalt = try filemanager.contentsOfDirectory(atPath: dokumentenverzeichnis)
    11. for inhalt in ordnerinhalt.sorted() {
    12. print(inhalt)
    13. }
    14. } catch let error {
    15. print("Fehler! \(error.localizedDescription)")
    16. }
    Alles anzeigen
    Ist das ein unglücklicher Weg? Ich würde morgen mal versuchen, die einzelnen Elemente des Verzeichnisses an ein TableView zu übergeben.
  • Nö, passt schon ... alternativ kannst Du auch den gesamten Verzeichnisbaum per „deep traversal“ mit einem Enumerator speichern und dann die passenden Elemente z. B. per Predicate filtern. Hängt etwas vom Anwendungsfall ab, für eine verzeichnisübergreifende Suche kann das z. B. sinnvoll sein.

    Mattes

    P.S.: Die Existenzprüfung würde ich per „existsAtPath“ vornehmen, einen Verzeichniswechsel brauchst Du nicht.
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ok, das funktioniert soweit. Nun werden alle in dem Verzeichnis abgelegten Dummys erkannt. Glücklicherweise auch der regulär versteckte Klassiker ".DS_Store". Nun ergeben sich ein paar Fragen:

    - Ich würde nun ein if-Statement schreiben, welches kontrolliert, ob die erste Position eines jeden Index innerhalb des Array mit einem Punkt beginnt. Ist das der Fall, würde ich den Eintrag aus dem Array werfen. Ist das effizient? Würdest du einen anderen Weg wählen?

    - Ich benötige mal einen Tipp. Es soll im nächsten Schritt implementiert werden, das mit einem Klick auf eine Zelle in das Verzeichnis gewechselt wird, oder ein Dokument/Bild geöffnet wird.

    - Ich musste mein ganzes Projekt einmal neu machen, da ich einen "Thread 1: signal SIGABRT"-Fehler nicht in den Griff bekommen habe. Also: Neues Projekt, alles einmal abgeschrieben und siehe da: Es funktioniert wieder. Kann man sagen, was da passiert ist? Ich kann diese Fehlermeldung nicht deuten.

    Danke für die Hilfe!
    Bilder
    • Screenshot.png

      73,93 kB, 828×1.792, 21 mal angesehen
    1. Ich würde unerwünschte Dateinamen erst gar nicht in das Array aufnehmen
    2. Bette Deinen UIViewController in einen UINavigationControllers ein, daraus ergibt sich automatisch der hierarchische Aufbau bei geschachtelten Verzeichnissen. Frage bei Touch ab, ob der aktuelle Eintrag ein Directory ist oder nicht (oder speichere Dir diese Information schon beim Einlesen). Dann pushe eine neue UIViewController-Instanz auf den NavigationStack. Bei einem Verzeichnis könntest Du ja eigentlich wieder die schon bestehende Klasse verwenden (vielleicht mit einem Property, das jeweils das aktuelle Verzeichnis beinhaltet).
    3. Keine Ahnung und ohne den Fehlerfall - und entsprechende Konsolmeldungen - kaum zu beantworten. Sicherlich kein identischer Code, vielleicht hattest Du auf nicht (mehr) allokierte Objekte zugegriffen...
    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.