#質問したいこと
お世話になっております。
現在、カレンダーアプリのようなものを作っています。
そこで、カレンダーで選択した日に予定を追加したいのですが、追加した後に表示するところで、
選択した日の予定が今日の日付に反映されてしまっています。(添付画像有り)
#コード
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
よろしくお願いします。
#追記- 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
提示していただいたコードだけでは把握できないのですが、
1. カレンダーで日付を選択したときのコード(これはcalendar(_:didSelect:at:)だと思いますが)
2. 日付を選択したあと詳細を入れる画面に遷移する場所
3. 遷移先で任意の日付を設定するコード
4. 遷移先から遷移元にセットした日付を設定するコード
5. 遷移元に戻ってきたときにカレンダーにその設定を反映するコード
などはどんな感じになっていますでしょうか。
それらのどこかで日付の設定が想定外になっているような気がします。
質問への追記ありがとうございます。
先ほど追加画面のコードを追記しました。
追記したところで、
print(formatter.string(from: Date()))
というコードがあるのですが、そこで今日の日付が表示されてしまっていました。
そこで、カレンダーをタップした時に、
UserDefaults.standard.set(dateLabel.text, forKey: "dateLabel")
というようにUserDefaultsに保存し、AddViewControllerのところで、
UserDefaults.standard.object(forKey: "dateLabel") as? String
として取り出してみましたところ、上手く選択した日付のところに保存することができました。
TsukubaDepot様のおかげで解決に至りました。
ありがとうございます!
解決したようでよかったです。
もしよかったら、自己解決という形で質問を閉じていただけないでしょうか。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー