Bundle.main.path (forResource: ofType: inDirectory :) gibt null zurück

85

Versuche nicht zu lachen oder zu weinen - ich komme erst nach 20 Jahren wieder zum Codieren ...

Ich habe mehr als 4 Stunden damit verbracht, Referenzen zu suchen und Codefragmente zu versuchen, um Bundle.main.path zum Öffnen meiner Textdatei zu bewegen So kann ich Daten für meine App einlesen (mein nächster Schritt besteht darin, sie entsprechend zu analysieren).

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt")
{
    do
    {
        let contents = try String(contentsOfFile: filepath)
        print(contents)

    }
    catch
    {
        print("Contents could not be loaded.")
    }
}
else
{
    print("newTest.txt not found.")
}

Das Ergebnis ist: "newTest.txt nicht gefunden." Unabhängig davon, wie ich versuche, die Datei per Drag & Drop in das Projekt zu ziehen, erstellen Sie die Datei in Xcode oder verwenden Sie den Menüpunkt Datei -> Dateien hinzufügen zu ...

Zakarius Jay Poggenpohl
quelle
let path: String = Bundle.main.path (forResource: "charlie", ofType: "txt")! let url: URL = URL (fileURLWithPath: path)
Himanshu Moradiya
Mögliches Duplikat von stackoverflow.com/questions/34548771/…
Leo Dabus
@LeoDabus Mein Problem ähnelt [link] stackoverflow.com/questions/40822170/… (das Sie auch kommentiert haben) und gibt mir auch den gleichen Fehler.
Zakarius Jay Poggenpohl
Bruder dein Problem lösen oder nicht?
Himanshu Moradiya
Nein, der gleiche Fehler. :. (...
Zakarius Jay Poggenpohl

Antworten:

197

Das Problem ist, dass die Datei nicht in Ihr App-Bundle kopiert wird. Etwas reparieren:

  • Klicken Sie auf Ihr Projekt
  • Klicken Sie auf Ihr Ziel
  • Wählen Sie Build-Phasen
  • Erweitern Sie Copy Bundle Resources
  • Klicken Sie auf '+' und wählen Sie Ihre Datei aus.
Denis Hennessy
quelle
1
Ich habe die Datei zu "Bundle-Ressourcen kopieren" hinzugefügt, sie aber auch in meiner Liste "Quellen kompilieren" gefunden, da es sich ursprünglich um eine schnelle Datei handelte, bis ich die Erweiterung geändert habe. Durch Ändern der Erweiterung wurde sie jedoch nicht aus "Quellen kompilieren" entfernt. Also zog ich es heraus, ließ es laufen und arbeitete wie ein Zauber.
Christopher Wade Cantley
9
Das hat bei mir funktioniert, als sonst nichts funktioniert hat. Warum wird eine Datei, die ich in Xcode ablege, nicht automatisch unter "Bundle-Ressourcen kopieren" angezeigt?
Trev14
@ Trev14 macht keinen Sinn, dass dies nicht automatisch geschieht
andrewcar
1
Wahnsinnig, habe ein paar Stunden verloren, als ich diesen "Trick" vergessen habe, um zu überprüfen, was dem App-Bundle hinzugefügt wird. Das Problem war, dass ich eine andere IDE verwendete, in der ich die Datei hinzugefügt habe und diese IDE die .pbxproj nicht bearbeitet hat, sodass ich meine Ressource nicht im App-Bundle hatte
jpcarreira
34

Überprüfen Sie das Optionsim add filesMenü, wenn Sie die Datei hinzufügen. Das Ziel in Add to targetsmuss angekreuzt sein, um es dem Bundle hinzuzufügen:

Wenn Sie sich tatsächlich in einem anderen Bundle befinden (z. B. Test), verwenden Sie:

guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
        fatalError("File not found")
}
flach gedacht
quelle
24

Klicken Sie in Ihrem Navigationsbereich auf Ihre Datei und öffnen Sie den rechten Bereich / Eigenschafteninspektor.

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sicher, dass Sie der Zielmitgliedschaft hinzufügen

Kelvin Fok
quelle
1
Für alle anderen, die dies sehen und dies ist die Lösung für Sie wie für mich, müssen Sie dies jedes Mal tun, wenn die Datei durch eine neue Version ersetzt wird.
Micah Montoya
5

Swift 3.0

let fileNmae = "demo"

let path = Bundle.main.path(forResource: fileNmae, ofType: "txt")
    do {
        let content = try String(contentsOfFile:path!, encoding: String.Encoding.utf8)
        print(content)
    } catch {
        print("nil")
    }

SWift 2.0

do{
      if let path = NSBundle.mainBundle().pathForResource("YOURTXTFILENAME", ofType: "txt"){
             let data = try String(contentsOfFile:path, encoding: NSUTF8StringEncoding)
             let myStrings = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
              print(myStrings)
       }
  } catch let err as NSError {
            //do sth with Error
            print(err)
  }

Ausgabe :

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.
Himanshu Moradiya
quelle
@ LeoDabus warten, ich konvertiere gerade diesen Code in Swift 3.0
Himanshu Moradiya
1
Ich
freue
welche Linie ? @ ZakariusJayPoggenpohl
Himanshu Moradiya
4

Ah, ich habe mich gerade mit genau dem gleichen Problem befasst wie das OP.

Das Problem ist, dass die hier und hier angegebenen Lösungen nicht funktionieren, wenn der Code auf einem Spielplatz ausgeführt wird, da das OptionsMenü von add filesanders aussieht , da es das Add to targetsFeld nicht anzeigt :

Geben Sie hier die Bildbeschreibung ein

Wenn Sie sich in einer .playgroundDatei befinden, drücken Sie stattdessen die Hide or show the NavigatorSchaltfläche oben rechts in Ihrem Xcode-Fenster (visueller Eindruck) ->Geben Sie hier die Bildbeschreibung ein

Sobald sich der Navigator auf der linken Seite des Xcode-Fensters geöffnet hat, ziehen Sie Ihre Datei einfach per Drag & Drop in das ResourcesVerzeichnis Ihres Spielplatzes.

Wenn Ihr Setup ungefähr so ​​aussieht, sollten Sie in Ordnung sein:

Geben Sie hier die Bildbeschreibung ein

Montmons
quelle
Vielen Dank. Dies hat mir geholfen, als ich Code auf dem Spielplatz getestet habe (Teil eines größeren Projekts).
Mayankk2308
3

Dies war hilfreich für mich: xcode - Kopieren Sie eine Ordnerstruktur in mein App-Bundle

Markieren Sie die Option "Ordnerreferenzen erstellen", wenn Sie Assets in verschachtelten Ordnern erstellen.

Suchen Sie dann den Pfad zur Datei wie folgt:

let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)
Arkadiusz Turlewicz
quelle
3

Es ist verrückt, wie viel Zeit ein so einfaches Problem kosten kann.

Einige Antworten hier haben mir geholfen, aber ich habe es immer versucht:

Bundle.main.url(forResource: selectedTitle, withExtension: "mp3")

Aus irgendeinem Grund funktioniert das nicht, aber das Abrufen des Pfads und das anschließende Übersetzen in eine URL funktioniert:

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)
zufällige Kontrolle
quelle
2

Gleiches Problem, etwas andere Situation und Lösung. Ich folge einem Tutorial, in dem der folgende Code verwendet wird:

    // Start the background music:
    if let musicPath = Bundle.main.path(forResource:
        "Sound/BackgroundMusic.m4a", ofType: nil) {
        print("SHOULD HEAR MUSIC NOW")
        let url = URL(fileURLWithPath: musicPath)

        do {
            musicPlayer = try AVAudioPlayer(contentsOf: url)
            musicPlayer.numberOfLoops = -1
            musicPlayer.prepareToPlay()
            musicPlayer.play()
        }
        catch { print("Couldn't load music file") }
    }
}

Ich hatte das gleiche Problem wie andere, aber keine der Lösungen hat das Problem behoben. Nach dem Experimentieren habe ich im folgenden Aufruf nur Sound aus dem Pfad entfernt und alles hat funktioniert:

Bundle.main.path(forResource: "BackgroundMusic.m4a", ofType: nil)

Es scheint, dass das Tutorial fehlerhaft war, als ich aufgefordert wurde, Sound in den Pfad aufzunehmen.

Friedenstyp
quelle
2

Ich file.txthabe meinem Projekt hinzugefügt und es wurde automatisch zu meinem Projekt hinzugefügt Copy Bundle Files. Für mich musste ich die Erweiterung aus dem entfernen forResourceund es hat funktioniert.

let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"
Ryan R.
quelle
0

Ich denke, Sie wollen die inDirectory:Methode nicht. Versuchen Sie stattdessen Folgendes:

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
Rob Mayoff
quelle