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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

Q&A

1回答

1050閲覧

Realmで取得したデータをセルに表示したい

dreamland

総合スコア43

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/03/29 16:55

編集2019/03/31 09:36

こんにちは。現在FScalendarを使ってカレンダーアプリを作成している初心者ものです。色々と自分なりに調べてもわからなかったので、ここで質問いたしました。お助けいただければ幸いです。

前提・実現したいこと

現在、FScalendarを使ってカレンダーアプリを作成しています。
Realmに保存したデータを取得し、日付をタップした際にTableviewのセルに保存したスケジュールを表示したいのですが、何も表示されない状態です。どうしたらセルに表示されるようになるでしょうか?教えていただきたいです。

イメージ説明

該当のソースコード

import UIKit import RealmSwift class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var task: UITextField! @IBOutlet weak var goal: UITextField! @IBOutlet weak var duedate: UITextField! var datePicker: UIDatePicker = UIDatePicker() override func viewDidLoad() { super.viewDidLoad() dateselector() task.delegate = self goal.delegate = self duedate.delegate = self let realm = try! Realm() print(Realm.Configuration.defaultConfiguration.fileURL!) } func dateselector () { //ピッカー設定 datePicker.datePickerMode = UIDatePicker.Mode.date datePicker.timeZone = NSTimeZone.local datePicker.locale = Locale(identifier: "ja-JP") //バーの設定 let toolbar = UIToolbar() toolbar.sizeToFit() let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let todaybtn = UIBarButtonItem(title: "今日", style: .plain, target: nil, action: #selector(today)) let donebtn = UIBarButtonItem(title: "完了", style: .done, target: nil, action: #selector(done)) toolbar.setItems([flexibleSpace,todaybtn,donebtn], animated: true) duedate.inputView = datePicker duedate.inputAccessoryView = toolbar } @objc func today() { datePicker.date = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日" duedate.text = "(formatter.string(from:Date()))" } @objc func done() { duedate.endEditing(true) //日付のフォーマット let formatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日" duedate.text = "(formatter.string(from: datePicker.date))" } @IBAction func save (_sender:Any){ if task.text!.count > 0 && (goal.text?.count)! > 0 && (duedate.text?.count)! > 0 { let realm = try! Realm() try! realm.write { let rel = [Schedule(value:["task":task.text!,"goal":goal.text!,"duedate":duedate.text!])] realm.add(rel) self.performSegue(withIdentifier: "toCalendar", sender: nil) } } } }
import UIKit import FSCalendar import CalculateCalendarLogic import RealmSwift class CalenderViewController: UIViewController, FSCalendarDelegate, FSCalendarDataSource, UITableViewDelegate, UITableViewDataSource, FSCalendarDelegateAppearance { var CalendarArray = [Schedule] () @IBOutlet weak var tableView : UITableView! override func viewDidLoad() { super.viewDidLoad() //tableView.tableFooterView = UIView() print(CalendarArray) } override func viewWillAppear(_ animated: Bool) { tableView.reloadData() } //表示する個数 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return CalendarArray.count } //表示する内容 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { print(13) //dequeueReusableCellとは、使い回し let cell = tableView.dequeueReusableCell(withIdentifier: "goalCell", for: indexPath) cell.textLabel?.text = CalendarArray[indexPath.row].task return cell } //データ取得 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { print(17) let tmpCalendar = Calendar(identifier: .gregorian) let year = tmpCalendar.component(.year, from: date) let month = tmpCalendar.component(.month, from: date) let day = tmpCalendar.component(.day, from: date) let yyyy = String(format:"%04d", year) let MM = String(format: "%02d", month) let dd = String(format: "%02d", day) let da = "(yyyy)/(MM)/(dd)/" let realm = try! Realm() var results = realm.objects(Schedule.self) results = results.filter("duedate == '(da)/'") CalendarArray.removeAll() for result in results { if result.duedate == da { CalendarArray.append(result) } } tableView.reloadData() } }
import Foundation import RealmSwift class Schedule: Object { @objc dynamic var task = "" @objc dynamic var goal = "" @objc dynamic var duedate = "" }

補足情報(FW/ツールのバージョンなど)

Xcode version 10.1
Swift version 4.2.1

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

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

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

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

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

dsuzuki

2019/04/02 09:02

状況を整理してください。 ・saveは実行されていますか。 ・realm内にデータは存在しますか。 ・func calendar( didSelect )は呼ばれていますか。 ・results.filter("duedate == '\(da)/'")は正常に動作していますか。
dreamland

2019/04/03 13:22

すいません、情報が不十分でした。 ①saveは実行されています。 ②realmにちゃんとデータは送られています。 ③func calendar( didSelect )はプリント関数で呼ばれているか、確認してみましたが呼ばれていませんでした。 ④results.filter("duedate == '\(da)/'")もプリント関数で確認しましたが、正常に動作していませんでした。
dsuzuki

2019/04/04 00:38

③の時点で、カレンダーのタップが認識できていないことになります。 (それとも別のfuncでタップイベントを受け取っていますか?) タップイベントを受け取る環境ができているか確認をお願いします。 ・storyboard上のカレンダーのdelegateとCalenderViewControllerが紐付けられていますか。 ・delegateのfuncは1字も間違いなく実装されていますか。
dreamland

2019/04/07 05:17

③func calendar (didSelect)にプリント関数で呼んでみても、コンソールに表示されないのですが、これはなぜ表示されなのいでしょうか? ・storyboard上のカレンダーのdelegateとCalendarViewcontrollerはちゃんと紐づけられていました。 ・delegateのfuncとはどこのことでしょうか?(すいません、初歩的な質問をしているかもしれません)
guest

回答1

0

CalenderViewController にて tableView に UITableViewDataSource が設定されていないのが原因です。

tableView に delegate と dataSource を設定してください。

投稿2019/04/07 01:03

errolizer

総合スコア441

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

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

dreamland

2019/04/07 05:24

CalendarViewControllerにて、UITableViewDataSourceとUITableViewDelegateを宣言してくださいということでしょうか?宣言ならしているのですが、、、
errolizer

2019/04/07 05:27

tableView.delegate = self tableView.dataSource = self
dreamland

2019/04/07 05:37

viewDidloadの中に書いてみました。ですが、未だにセルに保存したスケジュールは表示されませんでした。
errolizer

2019/04/07 05:44

ソースコードを見たところ、データがないからだと思います。 データが0件の場合0件のデータが表示されます。
errolizer

2019/04/07 05:56

1. CalenderViewController がロードされた時、CalendarArrayは0件のデータを持っています。 2. viewWillAppear で tableView.reloadData() しているため UITableViewDataSourceのデリゲートメソッドであるfunc tableView(_ tableView: numberOfRowsInSection:)が呼ばれます。 3. CalendarArrayの件数、つまりゼロを返すためTableViewは0件の表示を行います。 以上です。
dreamland

2019/04/07 11:29

そうだったのですね。では、Realmに保存されたデータも取得できていないということなのですね。 func calendar (didSelect)では、realmにセーブしたデータを取得し表示するように書いたつもりなのですが、プリント関数で呼び出しても何もコンソールに表示されません。 ①この場合は、何が原因として考えられますか? ②また、Realmで保存したデータをどう書いたらセルに表示できるのでしょうか?
errolizer

2019/04/07 12:30

① func calendar(...) を呼んでいるようには見えません。 つまりRealmを読み込む処理が呼ばれていないと思います。printログを見ればわかりますよね? CalenderViewController には FSCalendarDelegate, FSCalendarDataSource という二つのプロトコルが実装されているようですが、これらの使用方法を理解されているでしょうか? ②Realmのデータを読み込んでセルに値を設定すれば表示されます。 とは言っても初めは難しいと思いますので、まずはRealmから離れて固定のデータを表示してみてはいかがでしょうか? ・まずはTableViewの使い方、次にFScalendarの使い方、というようにひとつひとつクリアしていくのが良いかと思います。
dreamland

2019/04/07 13:05

①やはり、ちゃんとRealmが読み込まれていないのですね。FSCalendarDelegate, FSCalendarDataSourceこの二つのプロトコルの使用方法はちゃんと理解できていないと思います。 ②そうですね。一旦、RealmとFScalendarから離れて、TableViewで固定のデータを表示できるようにしてみます。着実に、一つ一つやっていこうかと思います。いきなり飛びすぎたかもしれません。 色々と教えていただき、ありがとうございます。
errolizer

2019/04/07 13:24

例えばこんな勉強が必要かと思いますよ。 1. TableViewに"1"から"10"を表示するプログラムを作れるようになる。 2. TableViewのセルをタップした時にそのセルの値をログ出力できるようになる。例) 「7がタップされた」 3. 任意の年月のFSCalendarを表示できるようになる。例)2020年8月のカレンダーを表示 4. FSCalendarのセルをタップした時に年月日をログ出力できるようになる。例) 「2010年8月10日がタップされた」 5. Realmにアイウエオの文字を保存し、それを読み込んでログ出力できるようになる。
dreamland

2019/04/09 09:46

丁寧に書いてくださり、ありがとうございます。すごく助かります。この手順通り、一つずつクリアしていこうかと思います。また、分からない点があれば質問するかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問