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

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

ただいまの
回答率

92.01%

  • Swift

    3553questions

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

  • TableView

    20questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

  • Core Data

    19questions

    Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

TableViewCellにテキスト内容を表示

解決済

回答 1

投稿 2016/12/21 16:54 ・編集 2016/12/21 20:56

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

Yuki29

score 1

TableViewCellにCoredataに保存させた項目を取り出して表示させたいです。
todoリストのような形で、TableViewから+ボタンを押して詳細入力画面にうつり、その詳細内容項目をCoreDataに保存し、TableView画面に戻り、その詳細の項目の一つをタイトルとしてリストに表示させたいです。
エラーは出ないですが、リストに項目が追加されません。
CoreDataにしっかり保存はできているのですが、データの要求がしっかりできていないのか、もしくはTableVIewCellに表示させるコードが間違っているのかが分かりません。どなたか、お願いいたします。

swift3.0
class ViewController:UIViewController,UITextFieldDelegate,UITableViewDelegate{


    var main:Main!
    var context:NSManagedObjectContext!
    var coreDataStack:CoreDataStack!
    // weak var editingTextField:UITextField?
    var numberList:[String] = []

    // 管理オブジェクトコンテキストの保存
    func saveContext () throws {
        if context.hasChanges {
            do {
                // コンテキストを保存
                try context.save()
            } catch let error as NSError {
                print("\(error)")
                throw error
            }
        }
    }
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()

        // do {
        //部活動登録用の管理オブジェクトコンテキストを取得する。
        let applicationDelegate = UIApplication.shared.delegate as! AppDelegate
        context = applicationDelegate.managedObjectContext

    do {
    //numberオブジェクトをフェッチする。
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Main")
    fetchRequest.predicate = NSPredicate(format:"number = %@")
    fetchRequest.predicate = NSPredicate(format:"tema = %@")
    let mainList = try context.fetch(fetchRequest) as! [Main]
    //dismiss(animated: true, completion: nil)
        numberList = []
        for main in mainList{
            numberList.append(main.number!)
        }

    } catch {
        print(error)
}
        print("回数\(numberList.count)")

    }
        private func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell {
            //  let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "MainCell"
            let cell = tableView.dequeueReusableCell(withIdentifier: "MainCell") as! TableViewCell
            cell.numberLabel?.text = main.number
           //cell.numberLabel?.text = numberList[indexPath.row]
            return cell
}

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

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

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

    クリップした質問はマイページの「クリップ」タブからいつでも見ることができます。

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • fuzzball

    2016/12/21 17:14 編集

    (やっぱりいいです)

    キャンセル

回答 1

checkベストアンサー

0

 TableView関係

cell.numberLabel?.text = numberList[indexPath.row]

でどうでしょう?

 CoreData関係

CoreDataの勉強をしてきました。
検索条件の設定あたりがおかしい(おそらく、そのせいで落ちていた)ようなので、ひとまず条件を設定せず、全てのデータを取得してみます。Swift3で書いたつもりですが、エラーが出たら適当に直すか質問して下さい。

do {
    //numberオブジェクトをフェッチする。
    let fetchRequest = NSFetchRequest(entityName: "Main")
    //let fetchRequest = NSFetchRequest<Main>(entityName: "Main") //※上の行でエラーが出たらこっちを使って下さい

    //※検索条件はひとまず保留
    //fetchRequest.predicate = NSPredicate(format: "number = %@")
    //fetchRequest.predicate = NSPredicate(format:"tema = %@")

    let mainList = try context.fetch(fetchRequest) as! [Main]
    print("mainList(\(mainList.count))=", mainList)

    numberList = []
    for main in mainList {
        numberList.append(main.number!)
    }
} catch {
    print("[error]", error)
}
print("numberList(\(numberList.count))=", numberList)

ちなみに、検索条件は、

//temaがhogehogeのデータを検索
fetchRequest.predicate = NSPredicate(format:"tema = %@", "hogehoge")

という風に設定します。

投稿 2016/12/21 17:15

編集 2016/12/22 09:34

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2016/12/21 17:51

    回答ありがとうございます!
    早速試してみましたが、
    変わりませんでした…

    キャンセル

  • 2016/12/21 18:01

    viewDidLoad()の最後に、
    print(numberList.count)
    を追加して、出力を教えて下さい。(もし0ならデータが取れていません)

    キャンセル

  • 2016/12/21 18:29

    出力されません。。。

    キャンセル

  • 2016/12/21 18:35 編集

    printをどこに入れたか、質問内のコードに追記して下さい。ついでに、コードの囲い始めを ``` だけではなく ```swift にして下さい。

    もう一つ、「dismiss(animated: true, completion: nil)」というコードは何でしょうか?不要だと思うので削除して下さい。(不安ならコメントアウトでいいです)

    キャンセル

  • 2016/12/21 18:42

    変更しました!

    キャンセル

  • 2016/12/21 19:01

    出力されていないことは無いと思うのでよく見て下さい。Xcodeの下部にある黒いところ(Debug area)ですよ?分かりにくければ print("@@@@@@@@", numberList.count) などとして目立つようにして下さい。

    キャンセル

  • 2016/12/21 20:58 編集

    本当です。
    上のように書いて実行してみました。「外部ファイル・・」というのは、もう一つのファイルに書いているものです。
    デバッグエリアでは以下のように表示されました。

    外部ファイルの出力先ディレクトリ
    /var/mobile/Containers/Data/Application/B6D93AB5-5289-454C-9FDA-DB119BD58C6F/Documents
    2016-12-21 20:55:27.746548 Bansyo5[1381:234788] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
    2016-12-21 20:55:27.748137 Bansyo5[1381:234788] [MC] Reading from public effective user settings.

    キャンセル

  • 2016/12/21 21:52

    二箇所あるprivateを削除して試してもらえますか?

    キャンセル

  • 2016/12/21 22:28

    やってみましたが結果は変わりませんでした。何度も申し訳ないです...

    キャンセル

  • 2016/12/21 22:34 編集

    let mainList = try context.fetch(fetchRequest) as! [Main]
    の下に、
    print(mainList.count)
    を追加して出力を教えてもらえますか?

    この続きは実際に試さないとダメっぽいので、明日試してみます。今は環境が無いのですみません。
    (CoreDataは使ったこと無いので勉強しないと‥)

    キャンセル

  • 2016/12/21 22:45

    結果は同じでした・・・
    ここまでくるとoverrideが全く機能していないように感じます、、、
    何度も何度も本当にありがとうございます。

    キャンセル

  • 2016/12/22 02:51

    コード上、UITableViewDataSourceが継承されてないですが、ストーリーボードから設定してあるのですか?継承されているにしても、一番下のnumberOfRowsInSectionを持つデリゲートメソッドは第一引数の外部引数名はなしなので「 _ 」 が必要です。privateを削除したとき、黄色マーク出ませんか?

    キャンセル

  • 2016/12/22 02:59

    それと、tableView.delegate = self と tableView.dataSource = self は大丈夫でしょうか。ストーリーボードからやってあればOKですが。

    キャンセル

  • 2016/12/22 07:17

    おおっと、その辺見落としてました。これで直ってくれるとCoreData調べなくて済むのですがw

    キャンセル

  • 2016/12/22 09:33

    CoreDataについて追記しました。TableView周りもおかしそうなので、上のfromageblanc
    さんの書き込みも忘れずに読んで下さい。

    キャンセル

  • 2016/12/22 11:52

    コードを書き直しました。TableViewはdelegateとdatasourceでつないでいます!
    ですが、変わりませんでした。
    怪しいなと思ったところがあるのですが、TableViewControllerのCustomClassがViewControllerに変更できません,,,
    ここは問題ではないですかね?

    キャンセル

  • 2016/12/22 11:58

    CoreData関係も修正されたのでしょうか?何も出力されてないですか?

    キャンセル

  • 2016/12/22 12:23

    上のコードを書き写しました!
    何も出力されないです。。。

    キャンセル

  • 2016/12/22 12:49 編集

    >>TableViewControllerのCustomClassがViewControllerに変更できません,,,

    もしかして、今はCustomClassにViewControllerが設定されていないのでしょうか?それならコードが実行されないのは当たり前です‥。

    UITableViewControllerなのでしたら、
    class ViewController: UITableViewController, ...(以下略)
    とした上でCustomClassを設定して下さい。

    キャンセル

  • 2016/12/22 15:24

    出ました!!!!
    mainList(0)= []
    numberList(0)= [] とデバッグエリアに表示されました!ありがとうございます!
    ですがセルが追加されません・・・

    キャンセル

  • 2016/12/22 15:28

    「CoreDataにしっかり保存はできているのですが」というのはどうやって確認したのでしょうか?

    キャンセル

  • 2016/12/22 16:23

    遷移先の画面でフェッチ要求し、その結果をデバッグエリアに表示させるように
    for main in mainList {
    print("講義回数:\(main.number!), テーマ:\(main.tema!)")
    と書きました。これが、しっかり表示されることから、Coredataに保存ができているのだとみなしました!

    キャンセル

  • 2016/12/22 16:30

    そこと同じコードを書けばいいと思うのですが。コードを見比べて下さい。
    あと、テーマはthemeです。

    キャンセル

  • 2016/12/22 22:17

    うまくいかないです・・・
    はい!簡単に書くためtemaにしています・・・笑

    キャンセル

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

ただいまの回答率

92.01%

関連した質問

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

  • Swift

    3553questions

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

  • TableView

    20questions

    TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

  • Core Data

    19questions

    Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

閲覧数の多いCore Dataの質問