やろうとしていること(ToDoアプリの画面まで作成)
SwiftでXcodeを使い簡単なToDoアプリを作っています。
作りとしては、よくある[一覧⇄リスト]の形のToDoリストアプリで、[ToDoリスト一覧]画面のToDoリスト一覧からToDoリストをタッチすると、[ToDoリスト]画面で該当するToDoリストのToDoの確認とチェックができるというものです。
[ToDoリスト一覧]画面と[ToDoリスト]画面はどちらもテーブルビューで作っており、それぞれの画面はテーブルビューで作成済みです。ストーリーボードは以下の通り。
あとは、[ToDoリスト一覧]画面で選択したToDOリストのToDoを[ToDoリスト]画面で表示させる処理を実装すればいいのですが、画面をまたいでのデータの受け渡しをどうするかがわかりません。
お聞きしたいこと(画面をまたいでのデータの受け渡しはどのようにしたらいいかがわからない)
お聞きしたい点は、階層構造のデータについて、画面をまたいでのデータの受け渡しはどのようにしたらいいかです。
Swiftの本を読んだりネットで調べたりしたところ、画面をまたいでデータをやりとりする方法は主に下記の3つの方法があるようですが、下記それぞれについて具体的なコードや設定等の実装方法や参考となる書籍やURLを教えていただけると助かります。また、それぞれについて階層構造のデータのやり取りができるかも教えていただけると幸いです。
①AppDelegateに共有するデータを設定して、データの受け渡しを行う
②SharedInstanceを利用して共有オブジェクトとパラメータを保持する
③CoreData、RealmなどのモバイルDBを利用して画面と別のDBからデータを引っ張ってくる
なお、本やネット以外の方法として、
2階層なのでUITableViewプロトコルのセクションとセルのデータ構造を画面間で共有してデータを引っ張ってくる([ToDoリスト一覧]はセクション、[ToDoリスト]画面はセルを表示する仕組み)作りにしてもいいのではないかと自分なりに考えたのですが、UITableViewプロトコルの中のデータを2つの画面で共有することはできるのでしょうか?
長くて分かりにくい文章ですみませんがよろしくお願いします。
開発環境
Swift4
Xcode9.2
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
やりやすくToDoListクラスなるものを作成して
class ToDoList: NSObject {
var title: String?
var content: String?
}
Todo一覧のViewController側で、データを格納させるための配列(todoListDataSource)を作成し、その中のrow番目のtoDoListを詳細側で渡せばいいのではないでしょうか?ちょっと雑にバーっと書きました
ただカスタムクラス(この場合ToDoListクラス)をUserDefaultで管理するのは少しめんどくさいので、この方法だとすんなりいかないかもしれませんが、応用はできるとは思います。(Realmとかだったら使いやすいと思いますし)
class ToDoListViewController {
var todoListDataSource: [TodoList] ?
func viewDidLoad() {
super.viewDidLoad()
getData()
}
func getData() {
//ここで、todoListDataSourceに格納するコードをかく。
}
}
.....
func func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let todoDetailVC = ToDetailViewController()
//ここで遷移先のViewControllerにtoDoListを渡す
toDodeitalVC.toDoList = todoListDataSource[indexPath.row]
//遷移先のコードをかく
(例)
navigationController?.pushViewController(todoDetailVC, animated: true)
}
toDoList使える↓
class ToDoDetailViewController: UIViewController {
var toDoList: ToDoList!
func viewDiDLoad() {
super.viewDidLoad()
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.06%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
fuzzball
2017/12/28 09:19
受け渡しのことは置いておいて、そもそもデータはどうやって保存しているのでしょうか?
koshira27
2017/12/29 04:29
現在各ビューの操作はuserDefaultsでデータを保存して行っていますが、データの受け渡し方法や今後のことを考えて修正する必要があると考えています。