◆実現したいことと分からないこと◆
いつもお世話になっておりますm(_ _)m
現在、食べたものを日記のように記録し、tablviewに表示する簡易なアプリを作っています。
cellには食べ物の名前とカロリー情報、今後は日付なども含めて複数の値を載せたいと考え構造体を配列化してデータを扱っています。
そこで質問なのですが、viewDidLoad()内で構造体(struct FoodLog)に追加した値はtableviewに表示されるのですが、Buttonを押したら食べたものとカロリーを後から構造体にappendしてtableviewに追加しようとしても反映がされません。
考えられることとして、tableviewのcell生成時のライフサイクルに原因があるのかと思いDispatchQueue.main.async{}を採用してみたのですが、それでも反映されませんでした。
DispatchQueue.main.async {
let new3 = FoodLog(food: "唐揚げ弁当", calorie: "790kcal") self.memo.append(new3) self.tv.reloadData() }
構造体にappendする時に何か問題があるのでしょうか?
以下が全体のコードになります
Swift5
1import UIKit 2 3struct FoodLog { 4 let food: String 5 let calorie: String 6} 7 8class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 9 10 var memo = [FoodLog]() 11 let tv = UITableView() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view. 16 tv.frame = self.view.frame 17 tv.dataSource = self 18 tv.delegate = self 19 //cellに名前を付ける 20 tv.register(UITableViewCell.self, forCellReuseIdentifier: "cell") 21 view.addSubview(tv) 22 let new = FoodLog(food: "牛カルビ弁当", calorie: "806kcal") 23 let new2 = FoodLog(food: "幕の内弁当", calorie: "635kcal") 24 memo += [new,new2] 25 } 26 27 @IBAction func add(_ sender: Any) { 28 DispatchQueue.main.async { 29 let new3 = FoodLog(food: "唐揚げ弁当", calorie: "790kcal") 30 self.memo.append(new3) 31 self.tv.reloadData() 32 } 33 } 34 35 func numberOfSections(in tableView: UITableView) -> Int { 36 return 1 37 } 38 39 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 40 return memo.count 41 } 42 43 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 44 45 let memo1 = memo[indexPath.row] 46 let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell") 47 cell.textLabel?.text = memo1.food 48 cell.detailTextLabel?.text = memo1.calorie 49 return cell 50 } 51}
回答1件
あなたの回答
tips
プレビュー