前提・実現したいこと
MapViewControllerのオレンジ色のお気に入りボタンをタップすると、FavViewControllerのTableViewに場所の名前や住所が追加される、といった機能を実装したいです。
現状として、MapVCのお気に入りボタンをクリック後、右下のお気に入りタブをタップしてFavVCを開いてもセルに反映されていません。
一度ビルドを停止してまた立ち上げ直すと追加されています。
要するにFavVCのTableViewのリロードがうまくいっていないだけだと思います。
そこで、
MapVCのお気に入りボタンをタップしたら、FavVCのTableViewがリロードされるようにしたいです。
該当のソースコード
MapViewController.swift
IBAction内のみ掲載します。
Swift
1// お気に入りボタンをタップしたとき 2@IBAction func tappedFavButton(_ sender: Any) { 3 4 favPlaces.append(selectedSearchAnnotationTitle ?? "") 5 favUserDefaults.set(favPlaces, forKey: "favPlaces") 6 7 favAddresses.append(placeAddressLabel.text ?? "") 8 favUserDefaults.set(favAddresses, forKey: "favAddresses") 9}
FavViewController.swift
目的はTableViewのリロードなので、viewDidLoad()
内にUserDefaultsに関していろいろ書いてありますが、省略させていただきます。
Swift
1import UIKit 2 3var favPlaces = [String]() 4var favAddresses = [String]() 5 6let favUserDefaults = UserDefaults.standard 7 8class FavViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate, UITableViewDataSource { 9 10 @IBOutlet weak var favSearchBar: UISearchBar! 11 @IBOutlet weak var favTableView: UITableView! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // 省略 17 } 18 19 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 20 return favPlaces.count 21 } 22 23 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 24 let cell = tableView.dequeueReusableCell(withIdentifier: "FavCell", for:indexPath) 25 26 if favPlaces.isEmpty == false { 27 cell.textLabel?.text = favPlaces[indexPath.row] 28 cell.detailTextLabel?.text = favAddresses[indexPath.row] 29 30 } else { 31 cell.textLabel?.text = "お気に入りはありません" 32 } 33 34 return cell 35 } 36}
試したこと1
まずはFavViewController.swiftのviewDidLoad()
内にreloadData()
メソッドを書きましたが、反映されませんでした。
タブビューですとビルド直後に実行されてしまっているのでしょうか……。
FavViewController.swift
Swift
1override func viewDidLoad() { 2 super.viewDidLoad() 3 4 favTableView.reloadData() // お気に入りボタンタップ後、反映されず。 5}
試したこと2
MapViewController.swiftのIBAction内の最後に以下のように書きました。
MapViewController.swift
Swift
1// お気に入りボタンをタップしたとき 2@IBAction func tappedFavButton(_ sender: Any) { 3 4 favPlaces.append(selectedSearchAnnotationTitle ?? "") 5 favUserDefaults.set(favPlaces, forKey: "favPlaces") 6 7 favAddresses.append(placeAddressLabel.text ?? "") 8 favUserDefaults.set(favAddresses, forKey: "favAddresses") 9 10 let favVC = FavViewController() // これを追加 11 favVC.favTableView.reloadData() // これを追加(ここにエラー) 12}
しかし、実行してMapVCのお気に入りボタンをクリックすると、favVC.favTableView.reloadData()
の行に以下のエラーが出ます。
Swift
1Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
Segueで繋がっていない場合、別ファイルの変数にどのようにアクセスすればいいのかあまり理解できておりません。
適切な方法がありましたら、ぜひ教えていただきたいです。
補足情報(FW/ツールのバージョンなど)
Xcode 11.6
Swift 5
ここまで読んでくださり、ありがとうございます。
質問に至らぬ点があるかもしれませんが、どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー