我通过使用我已添加到应用中的20个.txt文件构建一个简单的应用来练习。这就是我到目前为止所拥有的:
当选择了.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 ""
}
}
答案 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!
是安全的。