programing

Bundle.main.path(Resource:ofType:inDirectory:의 Resource:ofType인 경우)가 0을 반환합니다.

elecom 2023. 10. 25. 22:34
반응형

Bundle.main.path(Resource:ofType:inDirectory:의 Resource:ofType인 경우)가 0을 반환합니다.

웃거나 울지 않도록 노력하세요. 저는 이제 막 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 not found." 입니다. 파일을 프로젝트에 드래그 앤 드롭하는 방법에 상관없이 Xcode 안에 파일을 만들거나 파일 -> Add Files to ... 메뉴 항목을 사용합니다.

문제는 파일이 앱 번들에 복사되지 않는다는 것입니다.수정 방법:

  • 프로젝트 클릭
  • 대상 클릭
  • 빌드 단계 선택
  • 복사 번들 리소스 확장
  • '+'를 클릭한 후 파일을 선택합니다.

다시 확인합니다.Optionsadd files파일을 추가할 때 메뉴를 선택합니다.에서의 목표.Add to targets번들에 추가하려면 선택해야 합니다.

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

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

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

enter image description here

대상 구성원 자격에 추가해야 합니다.

그런 간단한 문제가 얼마나 많은 시간이 소요될 수 있는지 정말 놀랍습니다.

여기서 몇 가지 답변이 도움이 되었지만 저는 항상 다음과 같이 노력했습니다.

Bundle.main.url(forResource: selectedTitle, withExtension: "mp3")

어떤 이유로 작동하지 않지만 경로를 가져와 URL로 변환하면 다음과 같이 작동합니다.

let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)

이것은 나에게 도움이 되었습니다: xcode - 폴더 구조를 내 앱 번들에 복사합니다.

중첩 폴더에 자산을 작성할 때 "폴더 참조 작성" 옵션을 표시합니다.

그런 다음 파일의 경로를 찾습니다.

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

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

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

답은 간단히 Assets.xcassets를 사용하여 오디오 파일을 저장하고 오디오 파일을 추가하지 않는 것입니다. 즉, BeTheFirstAudio.m4a(QuickTime으로 제작), PROJECT Navigator(원으로 표시된, 분홍색) 파일 목록에 직접(사진 1)

enter image description here

경고! 파인더 창에서 오디오 파일을 끈 후 팝업이 나타나면 "그룹 만들기" 및 "대상에 추가" 확인란을 선택해야 합니다.

enter image description here

그런 다음 코드가 작동하여 오디오를 재생합니다(QuickTime의 .m4a 확장 포함).

 import AVFoundation

 class AudioPlayer: NSObject {


     private var audioPlayer: AVAudioPlayer!

     override init() {
         super.init()
    
         // get URL for the default audio
         let audioURL = Bundle.main.url(forResource: "BeTheFirstAudio", withExtension: "m4a")

         audioPlayer = try! AVAudioPlayer(contentsOf: audioURL!)
     }

애플 엔지니어들은 이 문제가 StackOverflow에서조차 문제가 된다는 것을 부끄러워해야 합니다. 개발자들은 Assets.xcassets에 오디오 파일을 추가하고 Bundle.main.url은 찾을 수 있어야 합니다.이 단순한 개념이 어렵다는 사실은 아마도 개발자들에게 많은 시간이 필요했을 것입니다.주의 @Apple

아, 그래서 방금 OP와 똑같은 문제를 다루고 있는 제 자신을 발견했습니다.

문제는 여기여기에 주어진 해결책이 운동장에서 코드가 실행될 때 작동하지 않는다는 것입니다.Options메뉴의add files그것은 그것을 보여주지 않기 때문에 다르게 보입니다.Add to targets드:

enter image description here

A 안에 있을 때.playground파일, 대신 를 누릅니다.Hide or show the NavigatorXcode 창의 오른쪽 상단에 있는 버튼(시각적 인상)-->

그런 다음 탐색기가 Xcode 창 왼쪽에서 열리면 파일을 끌어다 놓기만 하면 됩니다.Resources운동장 디렉토리.

설정이 다음과 같은 경우에는 문제가 없습니다.

enter image description here

같은 문제, 약간 다른 상황과 해결책.저는 다음 코드를 사용하라는 튜토리얼을 따르고 있습니다.

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

저도 다른 사람들과 같은 문제가 있었지만 해결책이 없었습니다.실험 끝에 다음 통화에서 경로에서 사운드를 제거하고 모든 것이 작동했습니다.

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"

내 문제는 코코팟으로 만들어진 하나의 모듈에 있었습니다.모든 포드 설치/업데이트, 파일(json 파일)은 프로젝트에 있었지만 번들 내에서 찾을 수 없었습니다.pod 설치/업데이트 후 파일을 제거(참고문헌 삭제)하여 프로젝트에 다시 추가하였습니다.

파일을 추가하는 대상에 항상 주의를 기울여야 합니다.

언급할 가치가 있습니다.

unit test 또는 ui test를 실행하는 경우 번들 ID를 사용합니다.메인 번들을 사용하지 않기 때문에, 당신은 당신의 파일을 절대로 호출하지 않을 것입니다.Bundle.main.path(forResource: "newTest", ofType: "txt").

테스트 대상 번들 ID를 사용합니다.제 경우에는 CSV 파일에서 데이터를 읽으려고 합니다.교체하다TestReadFileUITests당신의 반 이름으로 부터 확장됩니다.XCTestCase.

UI 테스트 케이스를 실행할 때 사용하는 실제 번들 ID입니다.메인 번들이 아닌 것을 알 수 있었습니다.

(lldb) po testBundle
NSBundle </Users/zhouhaibo/Library/Developer/CoreSimulator/Devices/448D1FCB-8311-4D3F-BEEF-934052C3470F/data/Containers/Bundle/Application/905C2326-8313-410F-9DC2-9D84B9C6D757/TestReadFileUITests-Runner.app/PlugIns/TestReadFileUITests.xctest> (loaded)

(lldb) po filePath
"/Users/zhouhaibo/Library/Developer/CoreSimulator/Devices/448D1FCB-8311-4D3F-BEEF-934052C3470F/data/Containers/Bundle/Application/905C2326-8313-410F-9DC2-9D84B9C6D757/TestReadFileUITests-Runner.app/PlugIns/TestReadFileUITests.xctest/Patients_2022-09-02.csv"
let testBundle = Bundle(for: TestReadFileUITests.self)
guard let filePath = testBundle.path(forResource: fileName, ofType: fileType) else {
    print("CSV file not found.")
    return [:]
}
class TestReadFileUITests: XCTestCase {

    func testDemo() {
        let _ = DataManager.readData()
    }
}

제 파일을 Assets 카탈로그에서 일반 폴더로 이동하여 비슷한 문제를 해결했습니다.

제 생각에 당신은 그를 원하지 않습니다.inDirectory:방법. .대신 이 방법을 사용해 보십시오.

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

R.swift를 사용하는 경우 다음을 수행합니다.

빌드 시간 동안 변경된 plist 파일에 대해 여전히 문제가 있었고 프로젝트가 R.swift를 사용하기 때문에 코드를 다음으로 변경했습니다.

Bundle.main.path(forResource: R.file.myplistfile)

매력적으로 통했습니다.

난 이걸 가지고 0을 던지고 있었습니다.

let myPath = Bundle.main.path(forResource: "Terms", ofType: "json")

제 파일 이름을 "용어"로 지었었죠JSON" 문제를 해결한 것이 "Terms.json"이어야 한다는 것을 깨달았을 때.

언급URL : https://stackoverflow.com/questions/41775563/bundle-main-pathforresourceoftypeindirectory-returns-nil

반응형