web-dev-qa-db-ja.com

Bundle.main.path(forResource:ofType:inDirectory :)はnilを返します

笑ったり泣いたりしないでください-20年後にコーディングに戻りました...

4時間以上参照を見てコードスニペットを試してBundle.main.pathを取得し、テキストファイルを開いてアプリのデータを読み込むことができるようにしました(次のステップは適切に解析することです) )。

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

結果:「newTest.txtが見つかりません。」ファイルをプロジェクトにドラッグ&ドロップする方法に関係なく、Xcode内でファイルを作成するか、[ファイル]-> [ファイルを追加...]メニュー項目を使用します。

問題は、ファイルがアプリバンドルに対応していないことです。修正するには:

  • プロジェクトをクリックしてください
  • ターゲットをクリックしてください
  • ビルドフェーズの選択
  • バンドルリソースのコピーを展開
  • 「+」をクリックして、ファイルを選択します。
127
Denis Hennessy

ファイルを追加するときは、add filesメニューのOptionsを再確認してください。 Add to targetsのターゲットをチェックして、バンドルに追加する必要があります。

実際に別のバンドル(たとえば、テスト)にいる場合は、次を使用します。

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

ナビゲーションパネルでファイルをクリックし、右パネル/プロパティインスペクターを開きます。

enter image description here

ターゲットメンバーシップに必ず追加してください

11
Kelvin Fok

Swift 3.

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.

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

出力:

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

file.txtをプロジェクトに追加すると、プロジェクトのCopy Bundle Filesに自動的に追加されました。私にとっては、forResourceから拡張機能を削除する必要があり、機能しました。

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

ああ、OPとまったく同じ問題に対処していることに気づきました。

問題は、add filesOptionsメニューが異なるため、コードがプレイグラウンドで実行されているときに here および here が指定されたソリューションが機能しないことです。 Add to targetsフィールドは表示されません。

enter image description here

.playgroundファイル内で、代わりにXcodeウィンドウの右上にあるHide or show the Navigatorボタンを押します(視覚的印象)-> enter image description here

次に、ナビゲータがXcodeウィンドウの左側に開いたら、プレイグラウンドのResourcesディレクトリにファイルをドラッグアンドドロップします。

セットアップが次のようなものであれば、大丈夫です:

enter image description here

2
Montmons

同じ問題、わずかに異なる状況と解決策。私は次のコードを使用するように言ったチュートリアルに従っています:

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

私は他の人と同じ問題を抱えていましたが、解決策のどれも問題を解決しませんでした。実験の後、次の呼び出しでパスからSoundを削除するだけで、すべてが機能しました。

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

パスにSoundを含めるように指示することで、チュートリアルがエラーになったように見えます。

1
peacetype

これは私にとって役に立ちました: xcode-フォルダ構造をアプリバンドルにコピーします

ネストされたフォルダーにアセットを作成するときに、「フォルダー参照の作成」オプションをマークします。

次に、次のようなファイルへのパスを見つけます。

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

inDirectory:メソッドは必要ないと思います。代わりにこれを試してください:

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