web-dev-qa-db-ja.com

NSBundle.mainBundle()。pathForResourceはnilを返します

Swiftの簡単なIOラッパーを記述しようとしています。

これをテストするために、プロジェクトルートに「Test.txt」という名前のファイルがあります。

この問題を抱えている他のすべての人から示唆されたように、Build Bundle Resources内のBuild Phasesにこのファイルを追加しました。

Build Bundle Resources

ファイルの内容を出力する目的で、1つの読み取り関数を持つ非常に単純なFileクラスを実装しました。

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

バンドルのコンテンツを印刷すると、ファイルシステム上の特定の場所へのURIを取得します。これは、シミュレーター内のアプリの仮想の場所であると想定しています。それに移動すると、実際に「Test.txt」ファイルが含まれていることがわかります。

今私がしたいのは、そのファイルへのパスを取得することです。

これを行うには、self.bundle.pathForResource("Test.txt", ofType: "txt")を呼び出します。

これは「nil」を返します

なぜ?:)

31
JaminB

nameパラメーターに.txtを含めないで、extensionパラメーターとして渡します。
ドキュメント から:

拡張子
検索するファイルのファイル名拡張子。
空の文字列またはnilを指定した場合、拡張子は存在しないものと見なされ、ファイルは名前と完全に一致する最初のファイルになります。

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

Objective-C

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

Swift 3.0、書き込み

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

交換してください

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

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

交換

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

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

ユニットテストでリソースにアクセスしようとしている人のために、私はリソースがメインバンドルで見つからず、私の解決策はすべてのバンドルでパスを検索するという問題に直面しました、このように指定する必要はありませんバンドル識別子。ここで、fileNameは関数に渡される文字列であり、もちろん型は任意のものです。

NSString *path;

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

NSBundle.mainBundle()。pathForResourceがnilを返すもう1つの理由は、ファイルがターゲットに適切に追加されていないことです。バンドル内のファイルをドラッグアンドドロップするときは、「ターゲットに追加」チェックボックスと「必要に応じてアイテムをコピー」チェックボックスが選択されていることを確認してください。

0
Mahadev Mandale

ofTypeパラメータはリソース名に追加されるため、次の行を置き換えます。

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

このようなものに:

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

Build Bundle Resourcesも確認する必要があります。

0
Golya Gilice