加载.txt文件的最佳方式?

时间:2018-04-26 00:28:36

标签: ios swift

我通过使用我已添加到应用中的20个.txt文件构建一个简单的应用来练习。这就是我到目前为止所拥有的:

  1. 创建了包含导航嵌入的tableviewcontroller和详细信息视图
  2. 使用tableview中的filemanager列出.txt文件的标题
  3. 当选择了.txt磁贴时,我一直试图将.txt文件加载到textview中。我尝试使用func加载,但是当选择.txt标题时,我会卡住如何调用load。任何人都可以帮助或链接我解释这个问题吗?

    理想情况下,我希望以一种允许比仅添加文本正文更具灵活性的方式添加.txt文件。这些是外语诗,我想在每行可以打开和关闭之后添加翻译。任何人都知道我怎么能这样做,如果我到目前为止所采取的方向是最好的方式到达那里?我应该以其他方式调用文件吗?

    这是我的视图控制器:

    import UIKit
    
    class ViewController: UITableViewController {
        var hymns = [String]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let fm = FileManager.default
            let path = Bundle.main.resourcePath!
            let items = try! fm.contentsOfDirectory(atPath: path)
    
            for item in items {
                if item.hasSuffix(".txt") {
                    hymns.append(item)
                }
            }
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return hymns.count
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Hymn", for: indexPath)
            cell.textLabel?.text = hymns[indexPath.row]
            return cell
        }
    
        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            if let vc = storyboard?.instantiateViewController(withIdentifier: "Detail") as? DetailViewController {
                vc.selectedHymns = hymns[indexPath.row]
                navigationController?.pushViewController(vc, animated: true)
            }
        }
    
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    And this is my detailViewController so far:
    import UIKit
    
    class DetailViewController: UIViewController {
    
        @IBOutlet weak var textView: UITextView!
    
        var selectedHymns: String?
        var hymnText = [String] ()
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let textToLoad = selectedHymn {
                if let hymnText = load(file: textToLoad){
                textView.text = hymnText
            }
    
        }
        }
    
        func load(file name:String) -> String {
            if let path = Bundle.main.path(forResource: name, ofType: "txt") {
                if let contents = try? String(contentsOfFile: path) {
                    return contents
                } else {
                    print("Error! - This file doesn't contain any text.")
                }
            } else {
                print("Error! - This file doesn't exist.")
            }
            return ""
        }
    }
    

2 个答案:

答案 0 :(得分:0)

尝试此操作以加载文件数据

func load(file name:String) -> String? {
        guard let filepath = Bundle.main.path(forResource: name, ofType: "txt") else {
            return nil
        }

        do {
            let contents = try String(contentsOfFile: filepath, encoding: String.Encoding.utf8)
            return contents
        }
        catch {
            print("Read Error")
            return nil
        }
    }

您可以使用

if let data = self.load(file: "YourFileName") {
    print(data)
}

答案 1 :(得分:0)

问题是hymns数组包含完整字符串路径,您将使用path(forResource加载内容,该内容需要文件名(字符串路径的最后一个路径组件)。

我强烈建议始终使用与URL相关的API,并在表格视图单元格中显示文件名。

  • 将数据源数组声明为URL

    的数组
    var hymns = [URL]()
    
  • viewDidLoad中,您可以用一行替换代码

    override func viewDidLoad() {
        super.viewDidLoad()
        hymns = Bundle.main.urls(forResourcesWithExtension: "txt", subdirectory: nil)!
    }
    

    该方法返回包中具有给定扩展名的所有文件的URL

  • cellForRow中,您只能显示文件名

    cell.textLabel?.text = hymns[indexPath.row].lastPathComponent
    

    您甚至可以删除扩展程序

    cell.textLabel?.text = hymns[indexPath.row].deletingPathExtension().lastPathComponent
    
  • DetailViewController中创建属性selectedHymn(更好地以单数形式)为URL

    var selectedHymn : URL!
    
  • 当然,您必须更改该行,才能将第一个视图控制器中的didSelectRowAt中的网址发送到

    vc.selectedHymn = hymns[indexPath.row]
    
  • 现在您拥有可以直接用于加载文本的文件的URL

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let hymnText = try! String(contentsOf: selectedHymn )
        textView.text = hymnText
    }
    

    根本不需要load(file方法。使用urls(forResourcesWithExtension方法检索的网址100%保证存在且强制try!是安全的。

  • 也不需要其他可选绑定