webentwicklung-frage-antwort-db.com.de

NSBundle.mainBundle (). PathForResource gibt null zurück

Ich versuche, einen einfachen IO - Wrapper für Swift zu schreiben.

Um dies zu testen, habe ich eine Datei namens "Test.txt" in meinem Projektstamm.

Ich habe diese Datei zu Build-Phasen in Build-Bundle-Ressourcen hinzugefügt, wie von allen anderen vorgeschlagen, die dieses Problem hatten.

Build Bundle Resources

Ich habe eine sehr einfache File-Klasse mit einer Lesefunktion implementiert, um den Inhalt der Datei auszugeben.

class File2{
    let resourceName: String
    let type: String
    let bundle = NSBundle.mainBundle()


    init(resourceName: String, type: String = "txt"){
        self.resourceName = resourceName
        self.type = type
        println(self.bundle)
    }

    func read(){
        let path = self.bundle.pathForResource("Test.txt", ofType: "txt") //Hard coded these in just to make sure Strings contained no whitespace
        println(path) //This returns nil...why?
        var error:NSError?
        //print(String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!)
        //return String(contentsOfFile:path!, encoding:NSUTF8StringEncoding, error: &error)!
    }
}

Wenn ich den Inhalt des Bundles drucke, bekomme ich eine URI an einen bestimmten Ort in meinem Dateisystem. Ich nehme an, es handelt sich um den virtuellen Ort der App im Simulator. Beim Navigieren darauf wird deutlich, dass es tatsächlich meine "Test.txt" -Datei enthält.

Jetzt möchte ich nur noch den Pfad zu dieser Datei erhalten.

Ich mache das, indem ich anrufe: self.bundle.pathForResource("Test.txt", ofType: "txt")

Dies gibt "Null" zurück

Warum? :)

31
JaminB

Fügen Sie den .txt nicht in den Parameter name ein, sondern übergeben Sie ihn als Parameter extension.
Aus der Dokumentation :

Erweiterung
Die Dateinamenerweiterung der zu lokalisierenden Datei.
Wenn Sie eine leere Zeichenfolge oder Null angeben, wird davon ausgegangen, dass die Erweiterung nicht vorhanden ist. Die Datei ist die erste gefundene Datei, die genau mit dem Namen übereinstimmt.

Swift3

let bundle = Bundle.main
let path = bundle.path(forResource: "Test", ofType: "txt")

Swift1 und Swift2

let bundle = NSBundle.mainBundle()
let path = self.bundle.pathForResource("Test", ofType: "txt")

Ziel c

NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"Test" ofType:@"txt"];
57
SwiftArchitect

In Swift 3.0 schreiben Sie mit 

let path = Bundle.main.path(forResource: "Test", ofType: "txt")
18
Vin

Ersetzen Sie Ihre 

 let path = self.bundle.pathForResource("Test.txt", ofType: "txt") 

mit 

let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt") 
13
Abhishek Sharma

Ersetzen

let path = self.bundle.pathForResource("Test.txt", ofType: "txt") 

mit

let path = self.bundle.pathForResource("Test", ofType: "txt") 
7
Kirit Vaghela

Für diejenigen von Ihnen, die versuchen, auf Ressourcen in Komponententests zuzugreifen, war ich mit einem Problem konfrontiert, bei dem die Ressource nicht im Hauptpaket gefunden wurde und meine Lösung darin bestand, den Pfad in allen Bündeln zu suchen. Auf diese Weise muss ich nicht angeben ein Bündelbezeichner, wobei fileName eine Zeichenfolge ist, die an die Funktion übergeben wird, und natürlich kann der Typ beliebig sein.

NSString *path;

for (NSBundle *bundle in [NSBundle allBundles]) {
    path = [bundle pathForResource:fileName ofType:@"json"];
    if (path) {
        break;
    }
}
1
Aly Yakan

Ein weiterer Grund für NSBundle.mainBundle (). PathForResource gibt zurück, dass die Datei nicht ordnungsgemäß zum Ziel hinzugefügt wurde. Stellen Sie beim Ziehen und Ablegen der Datei im Bundle sicher, dass das Kontrollkästchen "Zum Ziel hinzufügen" und das Kontrollkästchen "Elemente bei Bedarf kopieren" aktiviert ist.

0
Mahadev Mandale

Der Parameter ofType wurde an den Ressourcennamen angehängt. Ersetzen Sie daher diese Zeile:

 let path = self.bundle.pathForResource("Test.txt", ofType: "txt") 

zu so etwas:

 let path = self.bundle.pathForResource("Test", ofType: "txt") 

Die Build-Bundle-Ressourcen müssen ebenfalls geprüft werden.

0
Golya Gilice