ios - 为什么 Bundle.main.path(forResource : fileName, ofType : "txt") always return nil?

标签 ios swift uitextview

我想逐行读取文本文件并使用 example shown here 在 iOS 屏幕上显示它.

使 textView.text 可选是我可以让 readDataFromFile 运行的唯一方法。当我单击 load 时,该函数运行但始终返回 nil。我认为这意味着找不到文件。

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

如果有人能解释为什么从未找到文本文件,我是否需要做其他事情才能让项目找到它,或者读取函数是否返回 nil 由于某些其他原因,由于我实现它的方式。谢谢。

编辑 (2)

感谢您的反馈。作为回应,我做了四个小的代码更改,允许将文本文件内容写入 textView。更改包括:从文件名中删除文件扩展名,添加文件名数组,从 readDataFromFile 返回 String 而不是 String? 并重写 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)

该文件在项目导航器中可见。我会假设这意味着它在 bundle 中。

这是我的原始代码

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

文本文件.txt

Line 1
Line 2
Line 3
Line 4
Line 5

最佳答案

1) 你在这行有错误:

var fileName = "textFile.txt"

应该是:

var fileName = "textFile"

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

enter image description here

关于ios - 为什么 Bundle.main.path(forResource : fileName, ofType : "txt") always return nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643805/

相关文章:

ios - Xcode 8 约束

ios - 为什么 Xcode 以不同的方式对待两个相似的变量声明,其中第一个只显示警告,第二个显示警告 + 错误?

ios - 为什么我的应用程序因 fatal error 而崩溃,但仅在首次启动时崩溃?

ios - 刷新 iOS 指令缓存

ios - 具有SwiftUI和CoreLocation的纯MVVM

swift - 如何在 SwiftUI 中暂停动画?

ios - 如何使用 Swift 在后台播放音频?

ios - 在单元格中编辑 UITextView 时,iOS 7 中的 UITableView 不会滚动到正确的位置

iphone - 无法调用 UIKeyboard 通知

objective-c - segmentedControl 和 TextView 刷新/重新加载 - xcode