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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

Q&A

解決済

1回答

2513閲覧

【swift】ToDoリストの詳細画面と値の渡し方について

aiskw

総合スコア16

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/06/02 12:45

前提・実現したいこと

swift初心者です。ToDoリストアプリを作ろうと思い、Realmを用い制作を行っています。
アプリの大まかな構成としては、

1.一覧画面が表示される
2.一覧画面の上部にテキストビューを配置し、画面遷移無しで一覧にリストを追加できる
3.追加されたリストをタップで、詳細画面に遷移する
4.詳細画面でテキストの読み上げを行うことができる ←ここはまだ未実装

です。

上記、3までを作成したのですが、詳細画面に遷移してもタップしたセルの情報が表示されず、どうすればいいのかわかりません。
ToDoアプリ系でRealmを用いたサンプルプログラムを真似して作成しているので、あまりわかっていない部分も多いと思います。

下記にコードを記載いたしますので、どなたかご教示をいただけますと助かります。
よろしくお願いいたします。

ViewContoroller.swift

import UIKit import RealmSwift class ViewController: UIViewController, UITextViewDelegate { var result: String? @IBOutlet weak var inputTextView: UITextView! @IBOutlet weak var tableView: UITableView! var itemList: Results<TodoRealm>! override func viewDidLoad() { super.viewDidLoad() let realmValue1 = try! Realm() self.itemList = realmValue1.objects(TodoRealm.self) } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { self.view.endEditing(true) } @IBAction func tapAddButton(_ sender: Any) { let todoValue: TodoRealm = TodoRealm() todoValue.cellItem = self.inputTextView.text let realmValue2 = try! Realm() if inputTextView.text.isEmpty == false { try! realmValue2.write { realmValue2.add(todoValue) } } self.tableView.reloadData() inputTextView.endEditing(true) inputTextView.text = "" } } extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.itemList.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "todoCell", for: indexPath) let item: TodoRealm = self.itemList[(indexPath as NSIndexPath).row]; cell.textLabel?.text = item.cellItem cell.textLabel?.numberOfLines = 0 return cell } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { deleteTodo(at: indexPath.row) tableView.reloadData() } } func deleteTodo(at index: Int) { let realm = try! Realm() try! realm.write { realm.delete(itemList[index]) } } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { performSegue(withIdentifier: "goToDetal", sender: indexPath) } override func prepare(for segue : UIStoryboardSegue, sender: Any?){ if (segue.identifier == "goToDetail") { let detailView: DetailViewController = (segue.destination as? DetailViewController)! detailView.received = result! } } }

DetailViewContoroller.swift

import UIKit import RealmSwift class DetailViewController: UIViewController { var received: String? @IBOutlet weak var outputLabel: UILabel! @IBAction func tapCloseButton(_ sender: Any) { dismiss(animated: true, completion: nil) } override func viewDidLoad() { super.viewDidLoad() outputLabel.text = received } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

TodoRealm.swift

import Foundation import RealmSwift class TodoRealm: Object { @objc dynamic var cellItem: String? = nil }

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは、ソースコードにprint等を追加して、どんな操作をしたときにどのfucnが実行されるかを確認してください。

  1. func prepare(for segue : UIStoryboardSegue, sender: Any?)で、detailView.received = result! を行っていますが、resultの更新処理がどこにもありません。

  2. "goToDetal"と"goToDetail"では、一致していません。(iの差分)

  3. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

の実装がありますが、最新のSwiftでは、
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
です。
このfuncは、UITableViewDelegateで定義されています。
ViewControllerにUITableViewDelegateを継承させていないので、リストのタップイベントを取得できないように見えるのですが、ソースコードはここに提示されているので全てでしょうか。

投稿2019/06/04 08:32

dsuzuki

総合スコア1682

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

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

aiskw

2019/06/04 10:44

dsuzuki様 ご回答をいただきありがとうございます。 わからないことだらけですが、まずはprintを追加して、funcやbuttonなどがきちんと動作しているかを確認しています。 この「printを追加して」についても、正直あまりわかっておりませんでしたが、アドバイスをもとに調べ、必要性と活用法について理解できました。 そこで大変恐縮なのですが(もちろんご回答をいただけなくても結構です。)、 1と3についてはどのように対応すれば良いのでしょうか? ご指摘いただいた通り、didSelectRowAtやその他のfuncにprintを追加し、 実行されるか確認したところ、タップイベントは取得できておりませんでした。 1についても、更新処理とはなんなのでしょうか。 もしよろしければご教示いただけますと幸いです。
dsuzuki

2019/06/04 11:18

3.について、 リスト表示出来ているということは、storyboard上で、tableViewのdatasourceとしてViewControllerを紐付けていると推測します。 同様に、ViewControllerのextensionでUITableViewDelegateを実装し、 storyboard上で、tableViewのdelegateとしてViewControllerを紐付けします。 UITableViewDelegateの実装として、上記で記載したdidSelectRowAtを追加します。 ここまでで、タップイベントが取得できるか確認してください。 1.について、 3.でタップイベントが取得できると、引数のindexPathでリストの何番目がタップされたかがわかります。 あとは、itemListから該当するitemを取り出し、resultに設定してください。 なお、2.が原因で実行されていませんが、result がnil(初期値)のままで、result! を実行するとアプリが落ちます。
aiskw

2019/06/04 12:06

dsuzuki様 詳細かつ分かりやすいご回答をいただき本当にありがとうございます。 ご指摘の通り、tableViewのdatasourceのみstoryborad上で紐づけていたので、 >同様に、ViewControllerのextensionでUITableViewDelegateを実装し、 >storyboard上で、tableViewのdelegateとしてViewControllerを紐付けします。 こちらも試してみたのですが、いくらやってもstoryboard上での紐づけができません。 また、色々といじっていたらどんどんソースもよくわからなくなってきたため、アドバイスいただいた点に留意しながらもう一度最初から作り直して見ようと思います。 1についてもほぼ何もわからない状態だったにもかかわらず、アドバイスのおかげで次はなんとかなりそうな気がしています。 この度は大変分かりやすいご回答ありがとうございました! もし、また詰まってしまった場合は、お手すきかつ気が向いたらで構いせんので、ご教示いただけますと幸いです。よろしくお願いいたします。
dsuzuki

2019/06/04 12:41

補足メモ > ViewControllerのextensionでUITableViewDelegateを実装し、 extension ViewController: UITableViewDelegate { ... } extensionを利用せずに実装するなら、 class ViewController: UIViewController, UITextViewDelegate, UITableViewDataSource, UITableViewDelegate { ... } ViewControllerがUITableViewDelegateであるとXcodeが認識できないと、storyboard上では紐付けできません。 頑張ってください。
aiskw

2019/06/06 11:33

dsuzuki様 先日アドバイスをいただいた点に留意し再度作り直したところ、詳細画面へ無事に値を渡すことができました。 基本的なところからご丁寧にアドバイスをいただいたおかげです。 まだアプリ自体の完成はしていませんが、本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問