質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.24%

  • Swift

    5343questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3038questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

ドキュメント内のファイルをテーブルに表示する

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 76

ドキュメント下のCSVファイルをテーブルに表示させたいと考えています。

①試したこと

ドキュメント下のファイル名を取得(表示させるのはファイル名だけで良い)
TableViewをOutlet接続し、cellにファイル名を返すようにした

②上手くいかなかったこと

エラーは出ていないが、テーブルにファイル名が表示されない
(ファイル名を取得できていない?取得方法が間違えている?テーブルの設定がなされていない?)
ドキュメントのパスも取得しているので表示されると思うのですが、、、

わかる方いらっしゃいましたら、よろしくお願いします。

③該当コード

import UIKit

class sampleViewController: UIViewController,UITableViewDataSource {

let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]


    var fileNames: [String] {
        do {
            return try FileManager.default.contentsOfDirectory(atPath: documentPath)
        } catch {
            return []
        }
    }

    @IBOutlet weak var CsvTableiew: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell {
        let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]


        var fileNames: [String] {
            do {
                return try FileManager.default.contentsOfDirectory(atPath: documentPath)
            } catch {
                return []
            }
        }
        //セルを取得する。
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestCell", for:indexPath as IndexPath) as UITableViewCell

        //カンマでデータを分割して配列に格納する。
        let dataDetail = fileNames[indexPath.row]
        cell.textLabel?.text = dataDetail

        return cell
    }
    func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
        return fileNames.count
    }
}

④開発環境

xcode8 swift3 MacBook Pro

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

スマホ手持ち状態なので、返信が適当になりますが、ご容赦ください。 
filenamesに配列は入っていますか?
入っているとしたら、多次元配列ではないので、
//カンマでデータを...
の下の2行を1次元配列向けに書き換えてみてはどうでしょうか?
変数定数の中身をつど確認するとわかりやすいですよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 21:02

    filenames には配列を入れないといけないのですね。
    filenames にはドキュメント下のファイル名が入っていると認識していました。

    let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]

    var fileNames: [String] {
    do {
    return try FileManager.default.contentsOfDirectory(atPath: documentPath)
    } catch {
    return []
    }
    }

    この場合、ファイル名をテーブルに表示するにはどのよな記述が良いですか?

    キャンセル

0

自分は超初心者なので、できれば詳しい方の登場をまちたいのですが。

以下の部分を、

//カンマでデータを分割して配列に格納する。
let dataDetail = fileNames[indexPath.row]
cell.textLabel?.text = dataDetail

↓のように書き換えて、実行して見てはいかがでしょうか?

print("fileNames:","/n",fileNames)
cell.textLabel?.text. = fileNames[indexPath.row].replacingOccurrences(of: ".csv", with: "")

フォルダ内のアイテム一覧が取得されていれば、fileNamesに以下のようなデータが入っているはずです。

fileNames: 
["default.csv", "default01.csv", "default02.csv", "default03.csv"]

入ってればテーブルに反映されるはずですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 22:12

    アドバイスありがとうございます!実行してみましたが、ファイルが取得できていないせいか、表示されませんでした。TableViewはアウトレット接続しないほうが良いのでしょうか?

    キャンセル

  • 2018/01/11 22:27

    ちょっとまってくださいね。
    ただ、とりあえず、値を取得してfileNamesに格納することが第一ですので、そこを考えてください。
    ディレクトリ以下のファイル一覧を取得している箇所に、
    print("fileNames:","/n",fileNames)
    を追加して、ファイル一覧の取得がきちんとできているか確かめてください。
    なんか、2回取得してるのもなんで?と思うけど、それはそれとして。
    あとでもうちょっと書きますね。

    キャンセル

  • 2018/01/11 23:08

    let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]


    var fileNames: [String] {
    do {
    return try FileManager.default.contentsOfDirectory(atPath: documentPath)
    } catch {
    return []
    }
    }

    ↑を
    var fileNmes = [String]()

    にして、

    func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
    return fileNames.count
    }

    ↑を
    func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {
     if let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
    do {
    fileNames = try FileManager.default.contentsOfDirectory(atPath: documentDirectory)
    } catch {
    print("error")
    }
    }

    print("documentDirectory:",documentDirectory )
    print("fileNmes:",fileNmes)
    return fileNames.count
    }
    に変えて実行してみてください。
    パスとファイル一覧が取得できるはずです。パスがわかれば、ファイルをfinderでみれますので。
    ファイル一覧が取得できたらテーブルビューに取り掛かってください。
    エラーのところは適当なので書き直してください。
    動いたら、documentDirectoryとfileNmesの宣言の場所は、どこで使うかで変わると思うのでお好みで。

    キャンセル

  • 2018/01/12 12:48

    ほんとに丁寧にありがとうございます!!!
    実行してみます!!

    キャンセル

  • 2018/01/12 13:47

    print("documentDirectory:",documentDirectory )の記述で
    Use of unresolved identifier 'documentDirectory' エラーが出てしまいます。
    スペルは当たっていると思うのですが、print("documentDirectory:",documentPath)に変更すると
    エラーが消えます。

    ごめんなさい、ファイルパスをfinderで確認する方法を調べたのですが、取得したファイルの確認の仕方が
    わかりません。初心者申し訳有りません。

    キャンセル

  • 2018/01/12 16:59

    print("documentDirectory:",documentDirectory )は、
    直前で取得したパス
    (if let documentDirectory = NSSearchPathForD...のdocumentDirectory)を見れるように出力
    してるだけですよ。

    エラーが消えるのは良いのですが、documentPathの中身はどのようになってるでしょうか?
    実行すればプリントされるはずですよ。


    手順は
    1.ファイルを用意する (Macでの作業ですよ。)
    2.ファイルのディレクトリのパスを取得する
    3.取得したパスを使って、ファイル名一覧を取得する
    4.テーブルビューに表示する
    となると思います。
    難しくありませんので確実に
    一つ一つクリアしてみてください。

    キャンセル

  • 2018/01/13 00:37

    ありがとうございます!

    もう一度試してみます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • Swift

    5343questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3038questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。