Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 加载.txt文件的最佳方法?_Ios_Swift - Fatal编程技术网

Ios 加载.txt文件的最佳方法?

Ios 加载.txt文件的最佳方法?,ios,swift,Ios,Swift,我正在通过构建一个包含20.txt文件的简单应用程序进行练习,这些文件是我添加到应用程序中的。以下是我目前掌握的情况: 创建了嵌入导航和局部视图的tableviewcontroller 在tableview中使用filemanager列出.txt文件的标题 当选择.txt平铺时,我一直在尝试将.txt文件加载到textview中。我试着使用func加载,但在选择.txt标题时,如何调用加载却被卡住了。有人能帮我解释一下吗 理想情况下,我希望以一种比仅仅添加文本正文更灵活的方式添加.txt文件。这

我正在通过构建一个包含20.txt文件的简单应用程序进行练习,这些文件是我添加到应用程序中的。以下是我目前掌握的情况:

  • 创建了嵌入导航和局部视图的tableviewcontroller
  • 在tableview中使用filemanager列出.txt文件的标题
  • 当选择.txt平铺时,我一直在尝试将.txt文件加载到textview中。我试着使用func加载,但在选择.txt标题时,如何调用加载却被卡住了。有人能帮我解释一下吗

    理想情况下,我希望以一种比仅仅添加文本正文更灵活的方式添加.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 ""
        }
    }
    

    请尝试加载文件数据

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

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

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

    • 将数据源数组声明为
      URL的数组

      var hymns = [URL]()
      
      var selectedHymn : 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 hymns = [URL]()
      
      var selectedHymn : URL!
      
    • 当然,然后您必须更改第一个视图控制器中
      didSelectRowAt
      中的行,以将URL发送到

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

      override func viewDidLoad() {
          super.viewDidLoad()
      
          let hymnText = try! String(contentsOf: selectedHymn )
          textView.text = hymnText
      }
      
      根本不需要
      load(file
      方法。使用
      URL(对于资源)检索的URL(对于扩展
      方法)100%保证存在,强制
      try!
      是安全的。也不需要其他可选绑定


    请注意,如果您想编辑文本,首先需要将它们从您的应用程序包文件夹中移出/复制出来,该文件夹是只读的。我只希望文本是只读的。我已在identity inspector中取消选择了“可编辑”。感谢您的详细解释。我将在此处使用URL。关于使用UIScrollView的问题f UITextView。如果我将UITextView更改为UIScrollView,则scrollView.text=hymnText会出现错误。我了解到UITextView是UIScrollView的子级,因此我不应该使用.text作为属性吗?将UITextView放在UIScrollView中是唯一的方法吗?您可以单独或在
    U中使用
    UITextView
    IScrollView
    。但不能单独使用
    UIScrollView