繁体   English   中英

为什么Bundle.main.path(forResource:fileName,ofType:“ txt”)总是返回nil?

[英]why does Bundle.main.path(forResource: fileName, ofType: “txt”) always return nil?

我想逐行读取一个文本文件,并使用此处显示的示例将其显示在 iOS屏幕上。

制作textView.text可选的是我能得到的唯一途径readDataFromFile运行。 当我单击load该函数运行,但始终返回nil 我认为这意味着找不到该文件。

为了进行测试,我在Xcode中创建了文本文件。 我还尝试将其保存在桌面以及项目文件夹中。 无论哪种方式,都可以从项目导航器中读取它。 我还尝试使用TextEdit创建文件,因为该应用最终需要读取在Xcode外部创建的文本文件。

如果有人可以解释为什么从未找到文本文件,是否需要做其他事情才能使项目找到它,或者由于我的方式而使read函数由于其他原因返回nil ,我将不胜感激已经实施了。 谢谢。

编辑 (2)

感谢您的反馈。 作为响应,我做了四个次要的代码更改,以允许将文本文件内容写入textView。 更改包括:从文件名中删除文件扩展名,添加文件名数组,返回String而不是String? readDataFromFile并用代码重写UITextView 这解决了我所知道的问题。

这是修改后的代码

import UIKit

class ViewController: UIViewController {

var textView = UITextView()
var arrayOfStrings: [String]?
var fileNameWithExtension               = "textFile.txt"
let arrayOfFileNames                    = ["textFile1.txt", "textFile2.txt", "textFile3.txt", "textFile4.txt", "textFile5.txt"]

var fileName                            = String()

override func viewDidLoad() {
    super.viewDidLoad()

    //    remove comment in the next statement to test files named in ArrayOfFileNames    
    //    fileNameWithExtension               = arrayOfFileNames[4]

    fileName = fileNameWithExtension.replacingOccurrences(of: ".txt", with: "")

    createTextView()
    createButton()
}

func readDataFromFile(fileName: String) -> String {

   if let path                          = Bundle.main.path(forResource: fileName, ofType: nil) {

        print(fileName)

        do {
            let data                    = try String(contentsOfFile: path, encoding: String.Encoding.utf8)
            arrayOfStrings              = data.components(separatedBy: .newlines)
            textView.text               = arrayOfStrings?.joined(separator: "\n")

        } catch {
            textView.text               = "file contents could not be loaded"
        }

    } else {
        print(Bundle.main.path(forResource: fileName, ofType: "txt") as Any)
        textView.text                   = "\(fileName) could not be found"
    }
    return textView.text
}

func createButton () {
    let button = UIButton();
    button.setTitle(String("Load"), for: .normal)
    button.setTitleColor(UIColor.blue, for: .normal)
    button.frame = CGRect(x: 100, y: 10, width: 200, height: 100)
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    self.view.addSubview(button)
}

func buttonAction(myButton: UIButton) {
    textView.text = readDataFromFile(fileName: fileName)
    print(textView.text as Any)
}

func createTextView () {
    textView = UITextView(frame: CGRect(x: 20.0, y: 75.0, width: 340.0, height: 400.0))
    textView.textAlignment = NSTextAlignment.left
    textView.textColor = UIColor.blue
    textView.backgroundColor = UIColor.white
    self.view.addSubview(textView)
    }
}

编辑 (1)

该文件在项目导航器中可见。 我认为这意味着它在捆绑包中。

这是我的原始代码

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var textView: UITextView?

var arrayOfStrings: [String]?
var fileName                            = "textFile.txt"

override func viewDidLoad() {
    super.viewDidLoad()
    createButton()
}

func readDataFromFile(fileName: String) -> String? {

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

        do {
            let data                    = try String(contentsOfFile: path, encoding: String.Encoding.utf8)
            arrayOfStrings              = data.components(separatedBy: .newlines)
            print(arrayOfStrings as Any)

            textView?.text              = arrayOfStrings?.joined(separator: "/n")
            return textView?.text

        } catch {
            textView?.text              = "file contents could not be loaded"
            return textView?.text
        }

    } else {
        print(Bundle.main.path(forResource: fileName, ofType: "txt") as Any)
        textView?.text                  = "\(fileName) could not be found"
        return nil
    }
}

func createButton () {
    let button = UIButton();
    button.setTitle(String("Load"), for: .normal)
    button.setTitleColor(UIColor.blue, for: .normal)
    button.frame = CGRect(x: 100, y: 15, width: 200, height: 100)
    button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
    self.view.addSubview(button)
}


func buttonAction(myButton: UIButton) {
    print("works")
    textView?.text                      = readDataFromFile(fileName: fileName)
    print(textView?.text as Any)
}

textFile.txt

Line 1
Line 2
Line 3
Line 4
Line 5

1)您在此行中有错误:

var fileName = "textFile.txt"

应该:

var fileName = "textFile"

2)检查您的文件是否已连接到目标:

在此处输入图片说明

您应该考虑像这样添加类包所有者:

Bundle(for: ViewController.self).path(forResource: "fileName", ofType: "txt")

如果我是对的,这是从swift 2.0实现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM