- 写真のような、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
など左辺の表記の仕方が誤っていると思うのですが、どのように表記すれば良いのかわからず途方に暮れているためご教授いただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/09 08:14 編集
退会済みユーザー
2021/07/09 09:22