web-dev-qa-db-fra.com

NSBundle.mainBundle (). PathForResource renvoie nil

J'essaie d'écrire un simple IO wrapper pour Swift.

Pour tester cela, j'ai un fichier nommé "Test.txt" à la racine de mon projet.

J'ai ajouté ce fichier à Build Phases dans Build Bundle Resources, comme suggéré par tous les autres utilisateurs du même problème.

Build Bundle Resources

J'ai implémenté une classe File très simple avec une fonction de lecture dans le but de générer le contenu du fichier.

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)!
    }
}

Lorsque j'imprime le contenu de l'ensemble, j'obtiens un URI à un emplacement spécifique de mon système de fichiers, qui est, je suppose, l'emplacement virtuel de l'application dans le simulateur. En y accédant, il se trouve qu’il contient bien mon fichier "Test.txt".

Maintenant, tout ce que je veux faire, c'est obtenir le chemin d'accès à ce fichier.

Je le fais en appelant: self.bundle.pathForResource("Test.txt", ofType: "txt")

Ceci retourne "nil"

Pourquoi? :)

31
JaminB

N'incluez pas le .txt dans le paramètre name, transmettez-le en tant que paramètre extension.
De la documentation :

extension
L'extension du nom de fichier du fichier à localiser.
Si vous spécifiez une chaîne vide ou nil, l'extension est supposée ne pas exister et le fichier est le premier fichier rencontré qui correspond exactement à nom.

Swift3

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

Swift1 & Swift2

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

Objectif c

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

Dans Swift 3.0, écrivez avec 

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

Remplacez votre 

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

avec 

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

Remplacer

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

avec

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

Pour ceux d'entre vous qui tentent d'accéder aux ressources dans les tests unitaires, j'ai rencontré un problème: la ressource était introuvable dans le bundle principal et ma solution consistait à rechercher le chemin dans tous les bundles. un identifiant de paquet, où fileName est une chaîne passée dans la fonction et bien sûr, le type peut être celui que vous souhaitiez.

NSString *path;

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

Une autre raison de NSBundle.mainBundle (). PathForResource renvoie nil est que le fichier n’a pas été ajouté correctement à la cible. Lorsque vous faites glisser le fichier en liasse, assurez-vous que les cases à cocher "Ajouter à la cible" et "Copier les éléments si nécessaire" sont cochées.

0
Mahadev Mandale

Le paramètre ofType ajouté au nom de la ressource, remplacez donc cette ligne:

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

à quelque chose comme ça:

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

Le Build Bundle Resources est également nécessaire de vérifier.

0
Golya Gilice