尽量不要笑或哭 - 我只是在20年后重新开始编码...
我花了4个多小时查看引用并尝试使用代码片段来获取Bundle.main.path以打开我的文本文件,以便我可以读取我的应用程序的数据(我的下一步是适当地解析它)。 / p>
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中创建文件或使用文件 - >将文件添加到...菜单项。
答案 0 :(得分:126)
问题是该文件没有处理您的应用包。解决它:
答案 1 :(得分:23)
添加文件时,请仔细检查Options
菜单中的add files
。必须勾选Add to targets
中的目标才能将其添加到捆绑包中:
如果您实际上在另一个包中(例如测试),请使用:
guard let fileURL = Bundle(for: type(of: self)).url(forResource: fileName withExtension:"txt") else {
fatalError("File not found")
}
答案 2 :(得分:11)
答案 3 :(得分:5)
Swift 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.
答案 4 :(得分:3)
如此简单的问题要花多少时间,这很疯狂。
这里的一些答案对我有所帮助,但我一直尝试:
Bundle.main.url(forResource: selectedTitle, withExtension: "mp3")
出于某种原因,该方法不起作用,但随后获取路径并将其转换为URL即可:
let path = Bundle.main.path(forResource: selectedTitle, ofType: "mp3")
let url = URL(fileURLWithPath: path!)
答案 5 :(得分:2)
问题是,当在操场上执行代码时,here和here给出的解决方案不起作用,因为Options
的{{1}}菜单看起来不同因为它没有显示add files
字段:
当在Add to targets
文件中时,请按Xcode窗口右上角的.playground
按钮(视觉展示) - >
然后,一旦导航器在Xcode窗口的左侧折叠打开,只需拖动&将文件拖放到游乐场的Hide or show the Navigator
目录中。
如果您的设置看起来如下所示,那么您应该没问题:
答案 6 :(得分:2)
我将file.txt
添加到我的项目中,它会自动添加到我项目的Copy Bundle Files
中。对我来说,我必须从forResource
删除扩展程序并且它有效。
let path = Bundle.main.path(forResource: "file", ofType: "txt") // not forResource: "file.txt"
答案 7 :(得分:1)
同样的问题,略有不同的情况&解。我正在遵循一个说使用以下代码的教程:
// 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)
通过告诉我在路径中包含声音,似乎该教程出错了。
答案 8 :(得分:0)
我认为你不想要inDirectory:
方法。试试这个:
if let filepath = Bundle.main.path(forResource: "newTest", ofType: "txt") {
答案 9 :(得分:0)
这对我很有帮助:xcode - copy a folder structure into my app bundle
在嵌套文件夹中创建资产时,标记“创建文件夹引用”选项。
然后找到文件的路径,如下所示:
let path = Bundle(for: type(of : self)).path(forResource: "some_folder_a/some_folder_b/response.json", ofType: nil)
答案 10 :(得分:0)
我的问题出在一个用 Cocoapods 创建的模块中。每个 pod 安装/更新,文件(json 文件)都在项目中,但从未在 Bundle 中找到。在 pod install/update 之后,我删除了(删除了引用)文件并再次添加到项目中。
始终注意添加文件的目标。
答案 11 :(得分:0)
答案很简单,不要使用 Assets.xcassets 来存储您的音频文件, 并将您的音频文件,即)BeTheFirstAudio.m4a(用 QuickTime 制作),直接添加到项目导航器(圆圈,粉红色)文件列表(照片 1)
警告!在从 Finder 窗口拖动音频文件后出现弹出窗口时,请务必选中“创建组”和“添加到目标”复选框。
之后,您的代码应该可以播放音频(包括来自 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 应该能够找到它。这个简单的概念很困难,这一事实可能让开发人员花费了大量时间。注意@苹果