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

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

ただいまの
回答率

89.51%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 710

aiskw

score 10

前提・実現したいこと

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
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まずは、ソースコードに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 21:06

    dsuzuki様
    詳細かつ分かりやすいご回答をいただき本当にありがとうございます。
    ご指摘の通り、tableViewのdatasourceのみstoryborad上で紐づけていたので、

    >同様に、ViewControllerのextensionでUITableViewDelegateを実装し、
    >storyboard上で、tableViewのdelegateとしてViewControllerを紐付けします。

    こちらも試してみたのですが、いくらやってもstoryboard上での紐づけができません。
    また、色々といじっていたらどんどんソースもよくわからなくなってきたため、アドバイスいただいた点に留意しながらもう一度最初から作り直して見ようと思います。
    1についてもほぼ何もわからない状態だったにもかかわらず、アドバイスのおかげで次はなんとかなりそうな気がしています。
    この度は大変分かりやすいご回答ありがとうございました!

    もし、また詰まってしまった場合は、お手すきかつ気が向いたらで構いせんので、ご教示いただけますと幸いです。よろしくお願いいたします。

    キャンセル

  • 2019/06/04 21:41

    補足メモ
    > ViewControllerのextensionでUITableViewDelegateを実装し、
    extension ViewController: UITableViewDelegate {
    ...
    }

    extensionを利用せずに実装するなら、
    class ViewController: UIViewController, UITextViewDelegate, UITableViewDataSource, UITableViewDelegate {
    ...
    }

    ViewControllerがUITableViewDelegateであるとXcodeが認識できないと、storyboard上では紐付けできません。
    頑張ってください。

    キャンセル

  • 2019/06/06 20:33

    dsuzuki様

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

    キャンセル

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

  • ただいまの回答率 89.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる