表视图错误致命错误:加载文件时索引超出范围
Posted
技术标签:
【中文标题】表视图错误致命错误:加载文件时索引超出范围【英文标题】:Table view error Fatal error: Index out of range when loading file 【发布时间】:2017-10-21 13:32:20 【问题描述】:我正在尝试将 url 路径加载到我的 tableview 中,为 quicklook 框架做准备
使用下面的代码从 .document 中获取 url,当它第一次创建时它是空的
var fileURLs = [NSURL]()
然后
private func prepareFileURLS()
let csvFile = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
if FileManager.default.fileExists(atPath: csvFile.path)
fileURLs.append(csvFile as NSURL)
print(fileURLs)
然后使用下面的代码为标签命名
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let objectIdentifier = "ObjectsTableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: objectIdentifier, for: indexPath) as? ObjectsTableViewCell else
fatalError("The dequeued cell is not an instance of ObjectsTableViewCell")
//quickview
// Fetches the appropriate object for the data source layout
let currentFileParts = extractAndBreakFilenameInComponents(fileURL: fileURLs[indexPath.row])
cell.nameLabel.text = currentFileParts.fileName
//cell.photoImageView.image = cur.photo
//quickview
cell.descriptionLabel.text = getFileTypeFromFileExtension(fileExtension: currentFileParts.fileExtension)
return cell
并使用下面的方法将路径分解为导致错误的字符串
private func extractAndBreakFilenameInComponents(fileURL: NSURL) -> (fileName: String, fileExtension: String)
// Break the NSURL path into its components and create a new array with those components.
let fileURLParts = fileURL.path!.components(separatedBy: "/")
// Get the file name from the last position of the array above.
let fileName = fileURLParts.last
// Break the file name into its components based on the period symbol (".").
let filenameParts = fileName?.components(separatedBy: ".")
// Return a tuple.
return (filenameParts![0], filenameParts![1]) --> Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
致命错误:索引超出范围 我做错了什么?
【问题讨论】:
检查您的部分行数。可能是您尝试设置的行数超过您的 url 中存在的数据。 @Amit 这是你提到的那个吗? func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int return fileURLs.count 是的,这就是方法...再次运行代码,在 cellforRowAt_indexpath 上放置断点。并检查您的代码在哪个迭代中崩溃。 @Amit let objectIdentifier = "ObjectsTableViewCell" 我认为... cellforrowatindexpath 中的这一行 let currentFileParts = extractAndBreakFilenameInComponents(fileURL: fileURLs[indexPath.row]) 是错误的原因。因为在您访问它的 fileUrl 中的位置可能不存在数据。 【参考方案1】:相当明显的错误。您正在尝试访问 NSURL 的数组fileUrls
范围之外的索引。
使用您的代码,我看到一个可能导致此类错误的问题。
如您所知,您在代码的开头初始化了一个空数组。然后,在你的private func prepareFileURLS()
中,通过在你的 NSURLS 后面加上这个语句fileURLs.append(csvFile as NSURL)
来填充你的数组。问题是 你真的完成了你的数组吗?您的代码是否通过了您的 if 语句 if FileManager.default.fileExists(atPath: csvFile.path)
? 我鼓励您打印您的 fileURLs 数组以查看它包含的内容和长度。
那么您的问题将通过return (filenameParts![0], filenameParts![1])
声明在您的private func extractAndBreakFilenameInComponents(fileURL: NSURL) -> (fileName: String, fileExtension: String)
中传播。由于您的初始数组 fileURLs 不包含任何内容,因此您使用未设置的感叹号 filenameParts 解包,并且没有值 (=nil) 导致您的致命错误。
【讨论】:
谢谢!!这正是我要找的。是的,在用户之后在应用程序中创建文件之前,数组仍然是空的。这可能听起来很傻,但是我如何返回带有可选值的文件路径,因为一开始不会有任何文件。 @Arrabidas92 使用 ? 使其可选眼前以上是关于表视图错误致命错误:加载文件时索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
重新加载 ViewController 中的 tableview 让我在索引路径的 cellforRow 中出现“致命错误:索引超出范围”