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

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

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

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

Swift

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

Q&A

解決済

1回答

2918閲覧

[swift 5] 選択した日に予定を追加したい。

Kaguya_4869

総合スコア116

TableView

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

Swift

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

0グッド

0クリップ

投稿2020/05/08 08:09

編集2020/05/09 01:10

#質問したいこと
お世話になっております。
現在、カレンダーアプリのようなものを作っています。
そこで、カレンダーで選択した日に予定を追加したいのですが、追加した後に表示するところで、
選択した日の予定が今日の日付に反映されてしまっています。(添付画像有り)

#コード

swift

1//HomeViewController(カレンダーを表示するところ) 2import UIKit 3import FSCalendar 4import CalculateCalendarLogic 5import RealmSwift 6 7class HomeViewController: UIViewController, FSCalendarDelegate,FSCalendarDataSource,FSCalendarDelegateAppearance { 8 9 @IBOutlet weak var calendar: FSCalendar! 10 @IBOutlet weak var tableView: UITableView! 11 @IBOutlet weak var alertLabel: UILabel! 12 13 private let model = PlanUserDefaultsModel() 14 private var dataSource: [AddPlan] = [AddPlan]() { 15 didSet { 16 tableView.reloadData() 17 } 18 } 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 calendar.delegate = self 23 calendar.dataSource = self 24 calendar.scope = .week 25 } 26 27 override func viewWillAppear(_ animated: Bool) { 28 loadMemos() 29 let formatter = DateFormatter() 30 formatter.dateFormat = "yyyy年MM月dd日" 31 let date = Date() 32 let dateStr = formatter.string(from: date) 33 34 let realm = try! Realm() 35 let results = realm.objects(Event.self) 36 dataSource = [AddPlan]() 37 for ev in results { 38 if ev.date == dateStr { 39 print("ev: (ev.subject)") 40 let data = AddPlan(timeOne: ev.time1, timeTwo: ev.time2, subject: ev.subject, content: ev.contetnt, date: ev.date) 41 dataSource.append(data) 42 43 } 44 } 45 tableView.reloadData() 46 } 47} 48 49extension HomeViewController { 50 func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) { 51 self.view.layoutIfNeeded() 52 } 53 func getDay(_ date:Date) -> (Int,Int,Int){ 54 let tmpCalendar = Calendar(identifier: .gregorian) 55 let year = tmpCalendar.component(.year, from: date) 56 let month = tmpCalendar.component(.month, from: date) 57 let day = tmpCalendar.component(.day, from: date) 58 return (year,month,day) 59 } 60 61 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { 62 let formatter = DateFormatter() 63 formatter.dateFormat = "yyyy年MM月dd日" 64 let date = formatter.string(from: date) 65 66 let realm = try! Realm() 67 let results = realm.objects(Event.self) 68 dataSource = [AddPlan]() 69 for ev in results { 70 if ev.date == date { 71 print("ev: (ev.subject)") 72 let data = AddPlan(timeOne: ev.time1, timeTwo: ev.time2, subject: ev.subject, content: ev.contetnt, date: ev.date) 73 dataSource.append(data) 74 75 } 76 } 77 tableView.reloadData() 78 } 79} 80 81extension HomeViewController { 82 83 private func loadMemos() { 84 guard let memos = model.loadMemos() else { return } 85 self.dataSource = memos 86 } 87} 88 89extension HomeViewController: UITableViewDataSource, UITableViewDelegate { 90 91 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 92 return dataSource.count 93 } 94 95 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 96 97 let cell = tableView.dequeueReusableCell(withIdentifier: PlanTableViewCell.reuseIdentifier, for: indexPath) as! PlanTableViewCell 98 let memo = dataSource[indexPath.row] 99 let selectionview = UIView() 100 selectionview.backgroundColor = UIColor(red: 0/255, green: 187/255, blue: 255/255, alpha: 0.2) 101 cell.selectedBackgroundView = selectionview 102 103 cell.setUpPlanCell(timeOne: memo.timeOne, timeTwo: memo.timeTwo, subject: memo.subject, content: memo.content) 104 return cell 105 } 106}

swift

1//Event.swift 2import Foundation 3import RealmSwift 4 5class Event: Object { 6 7 @objc dynamic var time1: String = "" 8 @objc dynamic var time2: String = "" 9 @objc dynamic var subject: String = "" 10 @objc dynamic var contetnt: String = "" 11 @objc dynamic var date = String() 12} 13

Home1 AddHome2 Home3

よろしくお願いします。

#追記- AddTableViewController(追加画面)

swift

1import UIKit 2import RealmSwift 3 4class AddTableViewController: UITableViewController{ 5 6 @IBOutlet weak var timeOneTextField: UITextField! 7 @IBOutlet weak var timeTwoTextField: UITextField! 8 @IBOutlet weak var subjectTextField: UITextField! 9 @IBOutlet weak var contentTextView: UITextView! 10 11 @IBAction func Save() { 12 let realm = try! Realm() 13 let formatter = DateFormatter() 14 formatter.dateFormat = "yyyy年MM月dd日" 15 let date = formatter.string(from: Date()) 16 print(formatter.string(from: Date())) 17 18 try! realm.write{ 19 let events = [Event(value: ["time1": timeOneTextField.text!, 20 "time2": timeTwoTextField.text!, 21 "subject": subjectTextField.text!, 22 "content": contentTextView.text!, 23 "date": date])] 24 25 realm.add(events) 26 print("書き込み中") 27 } 28 print("書き込み完了") 29 navigationController?.popViewController(animated: true) 30 } 31} 32

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

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

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

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

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

TsukubaDepot

2020/05/08 23:09

提示していただいたコードだけでは把握できないのですが、 1. カレンダーで日付を選択したときのコード(これはcalendar(_:didSelect:at:)だと思いますが) 2. 日付を選択したあと詳細を入れる画面に遷移する場所 3. 遷移先で任意の日付を設定するコード 4. 遷移先から遷移元にセットした日付を設定するコード 5. 遷移元に戻ってきたときにカレンダーにその設定を反映するコード などはどんな感じになっていますでしょうか。 それらのどこかで日付の設定が想定外になっているような気がします。
Kaguya_4869

2020/05/09 01:41 編集

質問への追記ありがとうございます。 先ほど追加画面のコードを追記しました。 追記したところで、 print(formatter.string(from: Date())) というコードがあるのですが、そこで今日の日付が表示されてしまっていました。 そこで、カレンダーをタップした時に、 UserDefaults.standard.set(dateLabel.text, forKey: "dateLabel") というようにUserDefaultsに保存し、AddViewControllerのところで、 UserDefaults.standard.object(forKey: "dateLabel") as? String として取り出してみましたところ、上手く選択した日付のところに保存することができました。 TsukubaDepot様のおかげで解決に至りました。 ありがとうございます!
TsukubaDepot

2020/05/09 04:04

解決したようでよかったです。 もしよかったら、自己解決という形で質問を閉じていただけないでしょうか。 よろしくお願いします。
guest

回答1

0

自己解決

HomeViewControllerに以下を追記

@IBOutlet weak var dateLabel: UILabel! UserDefaults.standard.set(dateLabel.text, forKey: "dateLabel")

AddViewControllerには以下を追記

@IBOutlet weak var dateLabel: UILabel! dateLabel.text = UserDefaults.standard.object(forKey: "dateLabel") as? String

上の方法で解決することができました。
原因はAddViewControllerにて、

let formatter = DateFormatter() formatter.dateFormat = "yyyy年MM月dd日" let date = formatter.string(from: Date())

の部分で、今日の日付を取得してしまっていたところでした。

TsukubaDepot様、ありがとうございました。

投稿2020/05/09 04:25

Kaguya_4869

総合スコア116

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問