[ios] 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 내에 파일을 만들거나 파일-> 파일 추가 … 메뉴 항목을 사용합니다.



답변

문제는 파일이 App Bundle로 복사되지 않는다는 것입니다. 그것을 해결하기 위해:

  • 프로젝트를 클릭하십시오
  • 타겟을 클릭하세요
  • 빌드 단계 선택
  • 번들 리소스 복사 확장
  • ‘+’를 클릭하고 파일을 선택하십시오.


답변

파일을 추가 할 때 메뉴 Options에서 다시 확인 add files하십시오. Add to targets번들에 추가하려면 대상을 선택해야합니다.

실제로 다른 번들에있는 경우 (예 : 테스트) 다음을 사용하십시오.

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


답변

탐색 패널에서 파일을 클릭하고 오른쪽 패널 / 속성 관리자를 엽니 다.

여기에 이미지 설명 입력

대상 멤버십에 추가했는지 확인하십시오.


답변

스위프트 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)
  }

출력 :

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


답변

아, 방금 OP와 똑같은 문제를 다루고 있다는 것을 알게되었습니다.

문제는 여기여기에 제공된 솔루션 이 코드가 플레이 그라운드에서 실행될 때 작동하지 않는다는 것입니다. Options메뉴가 필드를 add files표시하지 않기 때문에 다르게 보입니다 Add to targets.

여기에 이미지 설명 입력

.playground파일 내부 에서 대신 Hide or show the NavigatorXcode 창의 오른쪽 상단에 있는 버튼을 누르십시오 (시각적 인상)->여기에 이미지 설명 입력

그런 다음 Xcode 창의 왼쪽에 Navigator가 열리면 파일을 Resources플레이 그라운드 의 디렉토리로 드래그 앤 드롭하면 됩니다.

설정이 다음과 같으면 정상입니다.

여기에 이미지 설명 입력


답변

동일한 문제, 약간 다른 상황 및 솔루션. 다음 코드를 사용하라는 자습서를 따르고 있습니다.

    // 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 를 포함하라고 지시하여 튜토리얼에 오류가있는 것 같습니다 .


답변

file.txt내 프로젝트에 추가했는데 내 프로젝트에 자동으로 추가되었습니다 Copy Bundle Files. 나를 위해 확장 프로그램을 제거 forResource해야했는데 제대로 작동했습니다.

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