97 votes

Bundle.main.path(forResource:ofType:inDirectory :) renvoie nil

Essayez de ne pas rire ou pleurer - je me remets tout juste au codage après 20 ans d'absence...

J'ai passé plus de 4 heures à consulter des références et à essayer des extraits de code pour que Bundle.main.path ouvre mon fichier texte afin que je puisse lire les données pour mon application (l'étape suivante consiste à les analyser de manière appropriée).

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.")
}

Le résultat est : "newTest.txt not found", quelle que soit la façon dont j'essaie de glisser-déposer le fichier dans le projet, de créer le fichier dans Xcode ou d'utiliser l'élément de menu Fichier -> Ajouter des fichiers à....

0 votes

Let path : String = Bundle.main.path(forResource : "charlie", ofType : "txt") ! let url : URL = URL(fileURLWithPath : path)

0 votes

0 votes

@LeoDabus mon problème est similaire à [lien]. stackoverflow.com/questions/40822170/ (que vous avez également commenté) et me donne également la même erreur.

223voto

Denis Hennessy Points 3085

Le problème est que le fichier n'est pas copié dans votre paquet d'applications. Pour le résoudre :

  • Cliquez sur votre projet
  • Cliquez sur votre cible
  • Sélectionner les phases de construction
  • Développer les ressources de l'offre groupée de copies
  • Cliquez sur '+' et sélectionnez votre fichier.

1 votes

J'ai ajouté le fichier à "Copy Bundle Resources", mais je l'ai également trouvé dans ma liste "Compile Sources", car il s'agissait à l'origine d'un fichier swift jusqu'à ce que je modifie l'extension. Mais le changement d'extension ne l'a pas supprimé de "Compile Sources". Je l'ai donc sorti, exécuté et ça a marché comme sur des roulettes.

11 votes

Cela a fonctionné pour moi quand rien d'autre ne fonctionnait. Pourquoi un fichier que je dépose dans Xcode n'apparaît pas automatiquement sous "Copy Bundle Resources" ???

1 votes

@Trev14 cela n'a aucun sens que cela ne se produise pas automatiquement.

37voto

shallowThought Points 11731

Vérifiez deux fois le Options dans le add files lors de l'ajout du fichier. La cible dans Add to targets doit être cochée pour l'ajouter au lot :

Dans le cas où vous êtes dans un autre bundle (test par exemple), utilisez :

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

28voto

Kelvin Fok Points 108

Cliquez sur votre fichier dans votre panneau de navigation et ouvrez le panneau de droite/Inspecteur de propriétés.

enter image description here

Assurez-vous d'ajouter des membres à votre cible

2 votes

Pour tous ceux qui voient ce problème et pour qui c'est la solution comme pour moi, vous devez faire cela à chaque fois que le fichier est remplacé par une nouvelle version.

6voto

Himanshu Moradiya Points 3367

Swift 3.0

let fileNmae = "demo"

let path = Bundle.main.path(forResource: fileName, 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)
  }

Sortie :

Hello Hems
Good Morning
I m here for you dude.
Happy Coding.

0 votes

@LeoDabus attendez je viens de convertir ce code en swift 3.0

1 votes

J'apprécie vraiment votre tentative d'aide, mais j'obtiens l'erreur suivante : fatal error : unexpectedly found nil while unwrapping an Optional value.

0 votes

Quelle ligne ? @ZakariusJayPoggenpohl

4voto

Montmons Points 1027

Ah, je viens de me retrouver avec exactement le même problème que le PO.

Le problème est que les solutions données aquí y aquí ne fonctionnent pas lorsque le code est exécuté dans une cour de récréation, puisque le code Options menu de add files est différent car il ne montre pas le Add to targets champ :

enter image description here

Lorsque vous êtes à l'intérieur d'un .playground à la place, appuyez sur le bouton Hide or show the Navigator en haut à droite de votre fenêtre Xcode (impression visuelle) --> enter image description here

Ensuite, une fois que le Navigateur s'ouvre sur le côté gauche de la fenêtre Xcode, il suffit de faire glisser et de déposer votre fichier dans l'onglet Resources de votre terrain de jeu.

Si votre installation ressemble à ce qui suit, tout devrait bien se passer :

enter image description here

0 votes

Merci. Cela m'a aidé, car je testais un code dans le Playground (qui fait partie d'un projet plus vaste).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X