表视图错误致命错误:加载文件时索引超出范围

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 中出现“致命错误:索引超出范围”

致命错误:数组索引超出范围。刷新时迅速

致命错误:索引超出范围搜索项目

从数组中删除 - 致命错误:索引超出范围 - SwiftUI 绑定

致命错误:索引超出范围的 tableview 有两个部分