2017-10-21 12 views
0

をロードするとき、私はそれがどこにあるか.documentからURLを取得するには、以下のコードを使用してクイックルック枠組み表ビューエラー致命的なエラー:範囲外のインデックスファイル

の準備を私のテーブルビューにURLパスをロードしようとしていますそれが最初のラベルに名前

を与えるために以下のコードを使用して、その後、その後

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

var fileURLs = [NSURL]() 

を作成したときに、空

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

文字列にパスを打破するために致命的なエラーを以下の方法を使用して:範囲 のうち指数は、私が間違って何をしましたか?

+0

セクションの行数を確認してください。あなたのURLに存在するデータよりも上の行を設定しようとしているかもしれません。 – Amit

+0

@Amitこれはあなたが言及したものですか? のfuncのtableView(_のtableView:のUITableView、numberOfRowsInSectionセクション:INT) - >のInt { リターンfileURLs.count } – JameS

+0

はい、これは方法です... cellforRowAt_indexpathにブレークポイントを置いて再びあなたのコードを実行します。また、コードがクラッシュする繰り返しを確認してください。 – Amit

答えて

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)はありません。

+0

ありがとう!!これはまさに私が探しているものです。はい、ユーザーが後でアプリケーションにファイルを作成するまで、配列はまだ空です。これはばかげているかもしれませんが、最初にファイルがないので、オプションの値でファイルパスを返すにはどうしたらいいですか? @ Arrabidas92 – JameS

+0

オプションで?の前に – Arrabidas92