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

时间:2017-10-21 13:32:20

标签: ios swift uitableview swift3 quicklook

我试图将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)
}

致命错误:索引超出范围 我做错了什么?

1 个答案:

答案 0 :(得分:2)

非常明确的错误。您正尝试访问NSURL数组fileUrls范围之外的索引。 使用您的代码,我发现一个可能导致此类错误的问题。

如您所知,您在代码的开头初始化一个空数组。然后,在private func prepareFileURLS()中,通过在NSURLS中添加此语句fileURLs.append(csvFile as NSURL)来填充数组。问题是你真的完成了你的阵列吗?您的代码是否通过了if语句if FileManager.default.fileExists(atPath: csvFile.path)我建议您打印fileURLs数组以查看其中包含的内容及其长度。

然后你的问题将在你的private func extractAndBreakFilenameInComponents(fileURL: NSURL) -> (fileName: String, fileExtension: String)中以return (filenameParts![0], filenameParts![1])声明传播。由于您的初始数组fileURLs不包含任何内容,您将使用未设置的感叹号filenameParts解包,并且没有值(= nil)导致致命错误。