いつも本当にお世話になっております。swift初心者です。
スケジュールアプリを作成しております。
Swift5 Xcode11で動かしております。
やりたいこと
ViewControllerに表示されているカレンダーから日付けをタップすると、下段のTableViewに押下されたごとに日付が表示されます。
セルをタップすると遷移先NextViewControllerで、時間、題名、といった情報を記入。
保存ボタン押下で遷移元のViewControllerに戻ります。
戻ったViewControllerで保存された情報をセルに反映させたいのです。
これまでは、値を遷移元に渡してcellForRowAtでviewWithTagに表記しておりましたが、それだと後から追加した日付も全く同じなるので、辞書型で情報の保存にUserDefaultsを使い、遷移元のViewControllerで取り出しセルに表示する方法が良いのかと考えており下記のようなコードを書いておりますが、UserDefaults保存時に"Attempt to insert non-property list object"のエラーが出ます。UserDefaultsから取り出してそれを表示する方法さえまだはっきり理解出来ていませんが。。。
(ちなみにViewControllerのセルにはタイトルと時間が入るようにします。それ以外の情報は他のページにて使う予定です。)
一言に反映させると言ってもいろいろやり方と順番があると思いますので、理解して解決したいと思っております。
何卒お付き合いよろしくお願いします。
*********************************
6/15 2:20~
新しくコードを編集いたしました!
*********************************
6/15 17:30~
新しく構造体で辞書型key値を作成。コードを追加&編集いたしました!
****追加しました 6/15 17:30~**** struct D { static let date = "date" static let startTime = "startTime" static let endTime = "endTime" static let projectTitle = "projectTitle" ****************** }
ViewController import UIKit import FSCalendar import CalculateCalendarLogic class CalendarViewController: UIViewController{ ****新しく定義しなおしました 6/15 2:20~**** var editDic : [[String:String]] = [[:]] var selectedRow = 0 **************************** override func viewDidLoad() { super.viewDidLoad() ) override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView.reloadData() } func calendar(_ calendar:FSCalendar, didSelect date:Date, at monthPosition: FSCalendarMonthPosition){ let tmpDate = Calendar(identifier: .gregorian) //let year = tmpDate.component(.year, from: date) let month = tmpDate.component(.month, from: date) let day = tmpDate.component(.day, from: date) let weekday = tmpDate.component(.weekday, from: date) let weekdaySymbolIndex: Int = weekday - 1 let formatter: DateFormatter = DateFormatter() formatter.locale = NSLocale(localeIdentifier: "ja") as Locale let call = formatter.shortWeekdaySymbols[weekdaySymbolIndex] //let selectDay = getDay(date) let schedulingDate = "(month)月(day)日 ((call))" ****新しく定義しなおしました 6/15 2:20~**** editDic.append([D.date:schedulingDate]) tableView.reloadData() } } //MARK: - UITableViewDelegate,UITableViewDataSource extension CalendarViewController:UITableViewDelegate,UITableViewDataSource{ func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ****新しく定義しなおしました 6/15 2:20~**** return editDic.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel!.text = editDic[indexPath.row][D.date] ?? "" ****新しく定義しなおしました 6/15 2:20~**** let jobTitleLabel = cell.viewWithTag(1) as! UILabel jobTitleLabel.text = editDic[indexPath][D.projectTitle] ?? "" let startTimeLabel = cell.viewWithTag(2) as! UILabel startTimeLabel.text = editDic[indexPath][D.startTime] ?? "" let endTimeLabel = cell.viewWithTag(3) as! UILabel endTimeLabel.text = editDic[indexPath][D.endTime] ?? "" ***************************** return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let nextVC = storyboard?.instantiateViewController(identifier: "ItemsForLocationsViewController") as! ItemsForLocationsViewController ****新しく定義しなおしました 6/15 2:20~**** nextVC.editDic = editDic[indexPath.row][D.date] selectedRow = indexPath.row nextVC.selectedNum = selectedRow **************************** navigationController?.pushViewController(nextVC, animated: true) } }
NextViewController
import UIKit class ItemsForLocationsViewController: UIViewController{ ****新しく定義しなおしました 6/15 2:20~**** var startTime = String() var endTime = String() var selectedNum = 0 var editDic : [[String:String]] = [[:]] ---略--- override func viewDidLoad() { super.viewDidLoad() } @IBAction func savingDate(_ sender: UIBarButtonItem) { guard let projectTitle = projectNameLabel.text else { return } let preNC = self.navigationController! let previousVC = preNC.viewControllers[preNC.viewControllers.count - 2] as! CalendarViewController ****新しく定義しなおしました 6/15 2:20~**** editDic[selectedNum][D.projectTitle] = projectTitle editDic[selectedNum][D.startTime] = startTime editDic[selectedNum][D.endTime] = endTime previousVC.editDic = editDic self.navigationController?.popViewController(animated: true) } }
回答1件
あなたの回答
tips
プレビュー