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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Core Data

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

TableView

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

Swift

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

Q&A

解決済

1回答

2391閲覧

TableViewCellにテキスト内容を表示

Yuki29

総合スコア7

Core Data

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

TableView

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

Swift

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

0グッド

0クリップ

投稿2016/12/21 07:54

編集2016/12/21 11:56

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/12/21 08:14 編集

(やっぱりいいです)
guest

回答1

0

ベストアンサー

TableView関係

swift

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

でどうでしょう?

CoreData関係

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

swift

1do { 2 //numberオブジェクトをフェッチする。 3 let fetchRequest = NSFetchRequest(entityName: "Main") 4 //let fetchRequest = NSFetchRequest<Main>(entityName: "Main") //※上の行でエラーが出たらこっちを使って下さい 5 6 //※検索条件はひとまず保留 7 //fetchRequest.predicate = NSPredicate(format: "number = %@") 8 //fetchRequest.predicate = NSPredicate(format:"tema = %@") 9 10 let mainList = try context.fetch(fetchRequest) as! [Main] 11 print("mainList(\(mainList.count))=", mainList) 12 13 numberList = [] 14 for main in mainList { 15 numberList.append(main.number!) 16 } 17} catch { 18 print("[error]", error) 19} 20print("numberList(\(numberList.count))=", numberList)

ちなみに、検索条件は、

swift

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

という風に設定します。

投稿2016/12/21 08:15

編集2016/12/22 00:34
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki29

2016/12/21 08:51

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

2016/12/21 09:01

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

2016/12/21 09:29

出力されません。。。
fuzzball

2016/12/21 09:35 編集

printをどこに入れたか、質問内のコードに追記して下さい。ついでに、コードの囲い始めを ``` だけではなく ```swift にして下さい。 もう一つ、「dismiss(animated: true, completion: nil)」というコードは何でしょうか?不要だと思うので削除して下さい。(不安ならコメントアウトでいいです)
Yuki29

2016/12/21 09:42

変更しました!
fuzzball

2016/12/21 10:01

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

2016/12/21 11: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.
fuzzball

2016/12/21 12:52

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

2016/12/21 13:28

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

2016/12/21 13:34 編集

let mainList = try context.fetch(fetchRequest) as! [Main] の下に、 print(mainList.count) を追加して出力を教えてもらえますか? この続きは実際に試さないとダメっぽいので、明日試してみます。今は環境が無いのですみません。 (CoreDataは使ったこと無いので勉強しないと‥)
Yuki29

2016/12/21 13:45

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

2016/12/21 17:51

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

2016/12/21 17:59

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

2016/12/21 22:17

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

2016/12/22 00:33

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

2016/12/22 02:52

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

2016/12/22 02:58

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

2016/12/22 03:23

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

2016/12/22 03:49 編集

>>TableViewControllerのCustomClassがViewControllerに変更できません,,, もしかして、今はCustomClassにViewControllerが設定されていないのでしょうか?それならコードが実行されないのは当たり前です‥。 UITableViewControllerなのでしたら、 class ViewController: UITableViewController, ...(以下略) とした上でCustomClassを設定して下さい。
Yuki29

2016/12/22 06:24

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

2016/12/22 06:28

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

2016/12/22 07:23

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

2016/12/22 07:30

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

2016/12/22 13:17

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問