NSBundle.mainBundle().pathForResource returns 无
NSBundle.mainBundle().pathForResource returns nil
我正在尝试为 Swift 编写一个简单的 IO 包装器。
为了测试这一点,我在项目根目录中有一个名为 "Test.txt" 的文件。
我已将此文件添加到 Build Bundle Resources 中的 Build Phases,正如遇到此问题的其他人所建议的那样。
我已经实现了一个非常简单的文件 class,带有一个读取功能,目的是输出文件的内容。
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")
这个returns"nil"
为什么? :)
不要在 name 参数中包含 .txt
,将其作为 extension 参数传递。
来自 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.
斯威夫特3
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"];
替换
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
和
let path = self.bundle.pathForResource("Test", ofType: "txt")
替换你的
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
和
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
将ofType参数附加到资源名称,所以替换这一行:
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
像这样:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Build Bundle Resources也是需要检查的
在swift 3.0中,写成
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
NSBundle.mainBundle().pathForResource returns nil 的另一个原因是文件未正确添加到目标。将文件拖放到捆绑包中时,请确保选中 "Add To Target" 复选框和 "Copy items if needed" 复选框。
对于那些试图在单元测试中访问资源的人,我遇到了在主包中找不到资源的问题,我的解决方案是在所有包中搜索路径,这样我就不会不必指定包标识符,其中 fileName
是传递给函数的字符串,当然类型可以是您想要的任何类型。
NSString *path;
for (NSBundle *bundle in [NSBundle allBundles]) {
path = [bundle pathForResource:fileName ofType:@"json"];
if (path) {
break; // Here is your path.
}
}
我正在尝试为 Swift 编写一个简单的 IO 包装器。
为了测试这一点,我在项目根目录中有一个名为 "Test.txt" 的文件。
我已将此文件添加到 Build Bundle Resources 中的 Build Phases,正如遇到此问题的其他人所建议的那样。
我已经实现了一个非常简单的文件 class,带有一个读取功能,目的是输出文件的内容。
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")
这个returns"nil"
为什么? :)
不要在 name 参数中包含 .txt
,将其作为 extension 参数传递。
来自 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.
斯威夫特3
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"];
替换
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
和
let path = self.bundle.pathForResource("Test", ofType: "txt")
替换你的
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
和
let path = NSBundle.mainBundle().pathForResource("Test", ofType: "txt")
将ofType参数附加到资源名称,所以替换这一行:
let path = self.bundle.pathForResource("Test.txt", ofType: "txt")
像这样:
let path = self.bundle.pathForResource("Test", ofType: "txt")
Build Bundle Resources也是需要检查的
在swift 3.0中,写成
let path = Bundle.main.path(forResource: "Test", ofType: "txt")
NSBundle.mainBundle().pathForResource returns nil 的另一个原因是文件未正确添加到目标。将文件拖放到捆绑包中时,请确保选中 "Add To Target" 复选框和 "Copy items if needed" 复选框。
对于那些试图在单元测试中访问资源的人,我遇到了在主包中找不到资源的问题,我的解决方案是在所有包中搜索路径,这样我就不会不必指定包标识符,其中 fileName
是传递给函数的字符串,当然类型可以是您想要的任何类型。
NSString *path;
for (NSBundle *bundle in [NSBundle allBundles]) {
path = [bundle pathForResource:fileName ofType:@"json"];
if (path) {
break; // Here is your path.
}
}