webentwicklung-frage-antwort-db.com.de

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

Versuchen Sie nicht zu lachen oder zu weinen - ich bin erst nach 20 Jahren wieder im Programmieren ...

Ich habe mehr als 4 Stunden damit verbracht, nach Referenzen zu suchen und Codeausschnitte zu versuchen, um Bundle.main.path zum Öffnen meiner Textdatei zu öffnen, damit ich Daten für meine App einlesen kann (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 wurde nicht gefunden." Unabhängig davon, wie ich versuche, die Datei per Drag & Drop in das Projekt zu ziehen, die Datei in Xcode zu erstellen oder den Menüpunkt Datei -> Dateien hinzufügen zu ... zu verwenden.

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

  • klicken Sie auf Ihr Projekt
  • Klicken Sie auf Ihr Ziel
  • Wählen Sie Build-Phasen aus
  • Erweitern Sie Bundle-Ressourcen kopieren
  • Klicken Sie auf "+" und wählen Sie Ihre Datei aus.
117
Denis Hennessy

Überprüfen Sie beim Hinzufügen der Datei die Variable Options im Menü add files. Das Ziel in Add to targets muss angekreuzt sein, um es dem Bundle hinzuzufügen:

 

Falls Sie sich tatsächlich in einem anderen Bundle befinden (zum Beispiel test), verwenden Sie:

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

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

 enter image description here

Stelle sicher, dass du zur Zielmitgliedschaft hinzufügst

7
Kelvin Fok

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.
5

Ich habe file.txt zu meinem Projekt hinzugefügt und es wurde automatisch zum Copy Bundle Files meines Projekts hinzugefügt. Für mich musste ich die Erweiterung aus der forResource entfernen und es funktionierte.

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

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

Das Problem ist, dass die angegebenen Lösungen here und here nicht funktionieren, wenn der Code auf einem Spielplatz ausgeführt wird, da das Options-Menü von add files anders aussieht, da das Feld Add to targets nicht angezeigt wird:

 enter image description here

Drücken Sie in einer .playground-Datei stattdessen die Hide or show the Navigator-Schaltfläche oben rechts in Ihrem Xcode-Fenster (visueller Eindruck) ->  enter image description here

Sobald der Navigator auf der linken Seite des Xcode-Fensters aufgeklappt ist, ziehen Sie Ihre Datei einfach in das Verzeichnis Resources Ihres Spielplatzes. 

Wenn Ihr Setup ungefähr wie folgt aussieht, sollten Sie in Ordnung sein:

 enter image description here

2
Montmons

Gleiches Problem, etwas andere Situation & Lösung. Ich folge einem Tutorial, das folgenden Code verwenden soll:

    // 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 löste das Problem. Nachdem ich experimentiert hatte, war alles was ich getan hatte, Sound aus dem Pfad in dem folgenden Aufruf zu entfernen und alles funktionierte:

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

Es scheint, dass das Tutorial falsch war, als ich sagte, Sound in den Pfad aufzunehmen.

1
peacetype

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

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

Dann finden Sie 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)
0

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

if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
0
rob mayoff