Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSBundle.mainBundle().pathForResource returns nil

I am trying to write a simple IO wrapper for Swift.

To test this I have a file named "Test.txt" in my project root.

I have added this file to Build Phases within Build Bundle Resources, as suggested by everyone else who has had this problem.

Build Bundle Resources

I have implemented a very simple File class with one read function with the intent to output the contents of the 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)!
    }
}

When I print the contents of the bundle I get a URI to a specific location on my filesystem, which I assume is the virtual location of the app in the simulator. Navigating to it reveals that it does indeed contain my "Test.txt" file.

Now all I want to do is get the path to that file.

I do this by calling: self.bundle.pathForResource("Test.txt", ofType: "txt")

This returns "nil"

Why? :)

like image 468
JaminB Avatar asked Jul 06 '15 04:07

JaminB


4 Answers

Do not include the .txt in the name parameter, pass it as the extension parameter.
From the documentation:

extension
The filename extension of the file to locate.
If you specify an empty string or nil, the extension is assumed not to exist and the file is the first file encountered that exactly matches name.

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"];
like image 194
SwiftArchitect Avatar answered Nov 02 '22 05:11

SwiftArchitect


In swift 3.0, write with

let path = Bundle.main.path(forResource: "Test", ofType: "txt")
like image 43
Vin Avatar answered Nov 02 '22 03:11

Vin


Replace your

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

with

let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt") 
like image 13
Abhishek Sharma Avatar answered Nov 02 '22 03:11

Abhishek Sharma


Replace

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

with

let path = self.bundle.pathForResource("Test", ofType: "txt") 
like image 7
Kirit Vaghela Avatar answered Nov 02 '22 03:11

Kirit Vaghela