Ошибка представления таблицы Неустранимая ошибка: индекс вне допустимого диапазона при загрузке файла

Я пытаюсь загрузить путь URL-адреса в свое табличное представление, готовящееся к структуре быстрого просмотра.

используя приведенный ниже код, чтобы получить URL-адрес из .document, где он пуст, когда он был впервые создан

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)
}

фатальная ошибка: индекс вне допустимого диапазона, что я сделал не так?


person JameS    schedule 21.10.2017    source источник
comment
Проверьте количество строк в разделе. Возможно, вы пытаетесь установить ни одной строки выше, чем данные существуют в вашем URL-адресе.   -  person Amit Kumar    schedule 21.10.2017
comment
@ Амит, это тот, о котором ты говорил? func tableView(_ tableView: UITableView, раздел numberOfRowsInSection: Int) -> Int { return fileURLs.count }   -  person JameS    schedule 21.10.2017
comment
Да, это метод... Запустите свой код еще раз, поставив точку останова на cellforRowAt_indexpath. И проверьте, на какой итерации ваш код дает сбой.   -  person Amit Kumar    schedule 21.10.2017
comment
@Amit let objectIdentifier = ObjectsTableViewCell   -  person JameS    schedule 21.10.2017
comment
Я думаю... Эта строка в cellforrowatindexpath let currentFileParts = extractAndBreakFilenameInComponents(fileURL: fileURLs[indexPath.row]) является причиной ошибки. Потому что может случиться так, что данные не существуют в позиции в файлеUrl, где вы к ним обращаетесь.   -  person Amit Kumar    schedule 21.10.2017
comment
да, это было первое, что пришло мне в голову, потому что в массиве нет исходного файла   -  person JameS    schedule 21.10.2017


Ответы (1)


Довольно явная ошибка. Вы пытаетесь получить доступ к индексу вне диапазона вашего массива fileUrls NSURL. С вашим кодом я вижу одну возможную проблему, вызывающую такую ​​​​ошибку.

Как вы знаете, вы инициализируете пустой массив в начале вашего кода. Затем в своем 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), вызывающего вашу фатальную ошибку.

person Arrabidas92    schedule 21.10.2017
comment
Благодарность!! это именно то, что я ищу. Да, массив по-прежнему пуст, пока пользователь не создаст файл в приложении после этого. Это может звучать глупо, но как я могу вернуть путь к файлу с необязательным значением, если вначале не будет никакого файла. @Аррабидас92 - person JameS; 21.10.2017
comment
Сделать это необязательным с? перед - person Arrabidas92; 21.10.2017