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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

1回答

893閲覧

【Swift】UITextFieldにデータベースから取得した文字列を初期値として表示したい

juliennu

総合スコア1

Realm

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/07/05 08:48

編集2021/07/05 09:04

#前提
イメージ説明 ViewController

  • 写真のような、ViewControllerとEntryViewControllerの2画面のアプリを制作しています。
  • ViewController上で+ボタンを押すとNew Item登録画面(EntryViewController)が表示されます。
  • ViewControllerのTableViewCellをタップした際も同様にEntryViewControllerが表示されます。
  • EntryViewControllerには、UITextField, UIDatePicker, UITextViewを配置しています。
  • データベースはRealmを利用しています。

#実現したいこと

  • TableViewCellをタップした際、EntryViewControllerのUITextField等にデータベースから取得した値を初期値として表示したい。

該当のソースコード

swift

1public class Item: Object { 2 @objc dynamic var id: Int = 0 3 @objc dynamic var title = "" 4 @objc dynamic var feature = "" 5 @objc dynamic var date = Date() 6 @objc dynamic var detail = "" 7 8 public override static func primaryKey() -> String? { 9 return "id" 10 }

###ViewController

swift

1class ViewController: UIViewController { 2 3 var data = [Item]() 4 5 let realm = try! Realm() 6 7 @IBOutlet var tableView: UITableView! 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 13 tableView.delegate = self 14 tableView.dataSource = self 15 16 navigationItem.leftBarButtonItem = editButtonItem 17 } 18 19 override func viewWillAppear(_ animated: Bool) { 20 super.viewWillAppear(false) 21 22 refresh() 23 } 24 25 @IBAction func didTapAddButton() { 26 refresh() 27 } 28 29 func refresh() { 30 data = realm.objects(Item.self).map{$0} 31 tableView.reloadData() 32 } 33} 34 35 36extension ViewController: UITableViewDelegate, UITableViewDataSource { 37 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 38 return data.count 39 } 40 41 //cellに表示する項目を指定 42 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 43 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 44 cell.textLabel?.text = data[indexPath.row].title 45 cell.detailTextLabel?.text = data[indexPath.row].feature//nil 46 return cell 47 } 48 //cell選択時のメソッド 49 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 50 tableView.deselectRow(at: indexPath, animated: true) 51 52 //各cellの詳細ページを開き、再編集できるようにする。 53 guard let vc = storyboard?.instantiateViewController(identifier: "EntryViewController") as? EntryViewController else { 54 return 55 } 56 57 let cellItem = data[indexPath.row] 58 59 vc.title = cellItem.title 60 61 vc.titleTextField?.text = cellItem.title//nil 62 vc.featureTextField?.text = cellItem.feature//nil 63 vc.datePicer?.date = cellItem.date//nil 64 vc.detailTextView?.text = cellItem.detail//nil 65 66 navigationController?.pushViewController(vc, animated: true) 67 68 }

###EntryViewController

swift

1class EntryViewController: UIViewController { 2 3 @IBOutlet var titleTextField: UITextField! 4 @IBOutlet weak var featureTextField: UITextField! 5 @IBOutlet weak var detailTextView: UITextView! 6 @IBOutlet var datePicer: UIDatePicker! 7 @IBOutlet weak var saveButton: UIBarButtonItem! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 titleTextField.delegate = self 13 featureTextField.delegate = self 14 detailTextView.delegate = self 15 16 datePicer.setDate(Date(), animated: true)/ 17 } 18}

発生している問題

  • didSelectRowAt内にUITextField等の初期値の設定をしているつもりなのですが、値がnilになってしまいます。
  • データベースの登録には問題がなく、vc.title = cellItem.titleは正しくタイトルが表示されます。
  • vc.titleTextField?.textなど左辺の表記の仕方が誤っていると思うのですが、どのように表記すれば良いのかわからず途方に暮れているためご教授いただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ViewControllerのTableViewCellをタップした際も同様にEntryViewControllerが表示されます。

そもそも追加画面と編集画面別にした方が良いのでは?

あとRealmはブラウザアプリがサポートされていないのでデータベースの中身確認できないはずです
基本使わない方が良いです。

少量のデータ保存→Userdefaults
大量のデータ保存(シンプルテーブル系で済むやつ)→Firebase
です。

設計が悪いとそこからどんどん進めても破綻すると思いますよ

上の内容だったら

  • メイン画面
  • 新規追加画面
  • 編集画面

っていう構成かと。

それにUITextFieldに初期値を設定するっぽい見た目は別の方法だってあります
例えば UITextView を使う方法とか。

どっちにしてもRealmはやめて Userdefaults に変更、新規と編集は分ける ようにした方が上手くいく気がします。

投稿2021/07/09 07:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

juliennu

2021/07/09 08:14 編集

ご回答ありがとうございます! 設計についてこれで良いのか迷いがあったためご指導いただき大変ありがたいです。 今後は目的ごとにViewControllerを分けて設計していきます。 また、Objectの選定についても柔軟に考え直します。 Realmの中身は`Realm Studio`というアプリケーションを利用して確認することができました。 Realm Studioについては、以下の記事を参考にしました。 https://qiita.com/mercy-333/items/c5b34ad08f17ba8c2169 データベースにRealmを用いた理由としては、 - 今後Viewなどを追加していく予定であり、大量のデータ保存が可能なものが良かった - Firebaseは以前に用いたことがあり、単純にRealmを使ってみたかった という理由で導入しました笑 今回Realmを使ってみて、やはりFirebaseの方がデータの確認等管理がしやすいと感じたので今後はFirebaseをメインで使っていきたいと思います。
退会済みユーザー

退会済みユーザー

2021/07/09 09:22

Realm Studioは使えないと思いますよ (あとSwiftの記事は2020年でも古い場合あります) それとFirebaseは意外と学習コスト高くて設計やセキュリティルールは一癖あるので経験者にアドバイスもらわないと結構キツイです。 (ドキュメント自体は充実していて読みやすいのですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問