2017-12-28 11 views

Antwort

1

Ihre Formulierung "es wäre praktischer, sie in der strukturierten Weise zugreifen" scheint darauf hinzuweisen, dass Sie denken, dass der Resources Ordner einen Ordnerbaum von Dateien nicht enthalten kann, kann es. Wenn Sie jedoch Xcode selbst Ihre Ressourcendateien in das Bundle kopieren lassen, wird der Baum flachgelegt, ohne dass die Option beibehalten werden muss (aus unbekannten Gründen). Um dies zu beheben, können Sie die Dateien mithilfe eines Build-Skripts in das Paket kopieren.

Kurz umrissen, müssen Sie die Lücken mit etwas zu lesen füllen:

  1. zuerst Ihre Dateien und Ordner in Ihrem Projekt hinzufügen. Verwenden Sie eine Gruppe pro Ordner, in Xcode 9 Erstellen einer Gruppe erstellt einen entsprechenden Ordner im Projektverzeichnis, aber in früheren Versionen müssen Sie die Gruppe erstellen und dann einen Ordner zuordnen - überprüfen Sie die Dokumentation der von Ihnen verwendeten Xcode-Version.
  2. Markieren Sie alle auf diese Weise hinzugefügten Ordner und Dateien als nicht als Teil Ihres Build-Ziels. Dadurch wird verhindert, dass Xcode die Dateien automatisch in das Bundle kopiert und dabei die Ordnerstruktur abflacht.
  3. Wechseln Sie nun in den Zieleinstellungen zur Registerkarte "Build Phases" und fügen Sie eine neue Build-Skript-Phase hinzu. Fügen Sie ein Shell-Skript hinzu, das etwa ditto verwendet, um den Ordnerbaum in das Paket zu kopieren. Es werden verschiedene Umgebungsvariablen gesetzt, die auf das Projekt und das Bundle verweisen, Ihre Xcode-Dokumentation überprüfen oder einfach ein Dummy-Skript ausführen und ausgeben (dies ist eine Option oder verwenden Sie printenv). Sie können diese Umgebungsvariablen verwenden, um die Quelle und das Ziel für Ihre Kopie zu bestimmen.
  4. In Ihrer App selbst können Sie den Stammordner Ihres Baums mithilfe von Standard-Bundle-Methoden lokalisieren. Von dort aus können Sie die Methode verwenden, die Sie wählen, um darin Elemente zu referenzieren, genauso wie Sie es tun würden, wenn der Ordnerbaum nicht innerhalb des Pakets wäre.

HTH

+0

Vielen Dank für diese ausführliche Antwort. Ich habe das schon ohne den Script-Trick versucht. Mein Ziel ist es, den NSFileManager zu verwenden, nachdem ich den Bundle-Pfad durchsucht habe, um ihn zu durchlaufen, wie ich es auf MacOS tun würde. Ich werde versuchen, das Skript zu schreiben, aber es fühlt sich nicht richtig an, es auf eine komplizierte Art und Weise zu tun (dachte, es wäre einfach). Wahrscheinlich ist es wegen iOS-Sandboxing eingeschränkt/nicht allgemein implementiert? – matthiaswitt

+0

@matthiaswitt - Es bezieht sich nicht auf Sandboxing. Aus unbekannten Gründen flacht die Standardkopie von Xcode-Elementen in einem Bundle jeden Ordnerbaum ab, ohne dass eine Option zum Speichern vorhanden ist. Die Leute haben es seit Jahren als Problem angesprochen. Eine Gruppe betrifft Bibliotheks-/Framework-Schreiber, die die enthaltenen Header-Dateien strukturieren möchten, wie es Apple selbst tun könnte. Allerdings ist es mit einem kurzen Build-Skript adressierbar, das nicht wirklich "kompliziert" ist, und wir können nur vermuten, dass dies Apples Grund ist, es nicht zu bauen. – CRD

Verwandte Themen