Ios 加载.txt文件的最佳方法?
我正在通过构建一个包含20.txt文件的简单应用程序进行练习,这些文件是我添加到应用程序中的。以下是我目前掌握的情况:Ios 加载.txt文件的最佳方法?,ios,swift,Ios,Swift,我正在通过构建一个包含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
该方法返回包中具有给定扩展名的所有文件的URLoverride func viewDidLoad() { super.viewDidLoad() hymns = Bundle.main.urls(forResourcesWithExtension: "txt", subdirectory: nil)! }
- 在
中,您可以只显示文件名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!
- 当然,然后您必须更改第一个视图控制器中
中的行,以将URL发送到didSelectRowAt
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!
U中使用UITextView
IScrollView
。但不能单独使用UIScrollView
。