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

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

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

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

Swift

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

Q&A

解決済

1回答

1727閲覧

遷移先で情報記入し、遷移元のtableViewで表示したい

SadajiroOkuno

総合スコア4

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/06/11 09:17

編集2020/06/15 08:32

いつも本当にお世話になっております。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) } }

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

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

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

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

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

hoshi-takanori

2020/06/14 10:59

よくあるやり方としては遷移元の ViewController を遷移先の NextViewController の delegate にするってやつですね。ところで、スケジュールアプリとのことで、複数のスケジュール情報を管理するんだと思いますが、データはどうやって保存してますか?
SadajiroOkuno

2020/06/14 13:56

hoshiさん御返信、誠にありがとうございます! トピック内容の範囲が大きすぎ、不躾で申し訳ありません、何卒よろしくお願いします。 保存はFirebaseを考えてます。 こちらのトピック掲載後に自分で考えていた方法は、ViewControllerでタップした日付を多次元配列でappendし、NextViewControllerで情報追加できるのかと考えておりました。しかし、恐らくコードが冗長になってしまうのかと思っております。お考えのdelegateでの方法など、何かアドバイス頂ければと思います。
SadajiroOkuno

2020/06/14 17:29

hoshiさんお世話になっております。コードの編集を致しました。 一応、自分が思っているような動きになりましたが、もっといい方法があるのではと思いまだ解決とはしておりません。お手隙のタイミングでお返事頂ければと思います。引き続きよろしくお願いします。
hoshi-takanori

2020/06/14 20:04

Firebase ってことはクラウド保存ですね。スケジュールを端末間で同期したり他のユーザーと共有できたりして便利ではありますが、就活のアポのような重要な情報を扱うなら、セキュリティやプライバシーには充分ご注意ください。また、ネットがつながってない場合のことも考える必要があるかも。 それから、編集後のデータの持ち方ですが、Dictionary の配列ってことですね。まぁそれでもできますが、キー (date, title, start, end など) のスペルミスなどの事故が起こったりするので、できれば独自のデータ型をちゃんと定義するのがお勧めです。
SadajiroOkuno

2020/06/15 08:41

hoshiさん毎度ありがとうございます。 ご指摘いただいた箇所を修正しました。 構造体で辞書型のkey値を定義しまして、それに伴う編集をしました。 セキュリティ学習出来ておりませんので進めて参りたいと思います。ネット環境でない場合の対策も視野に入れて進めて参ります。この辺りに関しては恐らく新たにトピックをあげさせて頂くと思いますので、その際はよろしくお願い致します。 delegateのリンクありがとうございます! 参考にさせて戴きます。パッと見てすぐ理解出来なさそうですが、辞書型以外での解決方法に取り組んで見ます。
guest

回答1

0

自己解決

今回はdelegateを使わず。ViewControllerで辞書型を配列に入れた変数を空で定義。
必要な場所でkey値でデータ保存し追加、そのデータ配列をNextViewControllerとViewController間で渡しテーブルビューに反映させました。
またhoshi-takanoriさんにもアドバイス戴きdelegateを使った方法も思案して行こうと考えております。
ひとまず、こちらで一度解決したということで締めます。
ありがとうございました。

投稿2020/06/16 08:46

SadajiroOkuno

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問