前提・実現したいこと
現在以下の動画のようなアプリを作っていて、そのコードをMVCで書き直しています。
そこで動画の最後の方のtableViewのセルをスワイプで削除したときに、一番上の合計獲得標高の更新をすることができずにいます。
発生している問題・エラーメッセージ
Modelでセルの生成と表示はできています。
スワイプで削除する操作もModelで行っていて、削除後にtableViewの更新をし合計獲得標高の値を変更することができません。ModelからtableViewの更新はできないので、Controllerで更新をするように伝えるような方法はないでしょうか?
該当のソースコード
Controller
1import UIKit 2import RealmSwift 3 4class RecordListViewController: UIViewController { 5 6 let realm = try! Realm() 7 8 private let dataSource = ElevationDataSource() 9 10 var model: Results<RealmData>? 11 12 @IBOutlet fileprivate weak var tableView: UITableView! { 13 didSet { 14 tableView.dataSource = dataSource 15 tableView.delegate = dataSource 16 17 tableView.register(UINib(nibName: "ElevationListTableViewCell", bundle: nil), forCellReuseIdentifier: "ElevationListTableViewCell") 18 tableView.register(UINib(nibName: "ElevationSumTableViewCell", bundle: nil), forCellReuseIdentifier: "ElevationSumTableViewCell") 19 } 20 21 } 22 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 27 model = realm.objects(RealmData.self).sorted(byKeyPath: "id", ascending: true) 28 dataSource.setupModel(model) 29 } 30}
Model
1import UIKit 2import RealmSwift 3import SwipeCellKit 4 5class ElevationDataSource: NSObject { 6 7 let realm = try! Realm() 8 9 var model: Results<RealmData>? 10 11 var sum: Double = 0.0 12 13 func setupModel(_ model: Results<RealmData>?) { 14 self.model = model 15 sum = model?.sum(ofProperty: "elevation") ?? 0.0 16 } 17} 18 19extension ElevationDataSource: UITableViewDataSource, SwipeTableViewCellDelegate { 20 21 //スワイプした際に表示される文字や画像を設定。またタップした際の処理も設定 22 func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]? { 23 guard orientation == .right else { return nil } 24 25 let deleteAction = SwipeAction(style: .destructive, title: "Delete") { action, indexPath in 26 27 self.updateModel(indexPath) 28 } 29 30 deleteAction.image = UIImage(named: "delete-Icon") 31 32 return [deleteAction] 33 } 34 35 func updateModel(_ indexPath: IndexPath) { 36 if let elevationForDeletion = self.model?[indexPath.row] { 37 do { 38 try self.realm.write { 39 self.realm.delete(elevationForDeletion) 40 } 41 model = realm.objects(RealmData.self).sorted(byKeyPath: "id", ascending: true) 42 setupModel(model) 43// self.loadView() 44// self.viewDidLoad() 45// このあたりでtableViewを更新する操作をしたいです 46 } catch { 47 print("Error deleting elevation (error)") 48 } 49 } 50 } 51 52 func tableView(_ tableView: UITableView, editActionsOptionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeOptions { 53 var options = SwipeOptions() 54 options.expansionStyle = .destructive 55 return options 56 } 57 58 func numberOfSections(in tableView: UITableView) -> Int { 59 2 60 } 61 62 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 63 if section == 0 { 64 return 1 65 } else { 66 return model?.count ?? 1 67 } 68 } 69 70 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 71 if indexPath.section == 0 { 72 guard let cell = tableView.dequeueReusableCell(withIdentifier: "ElevationSumTableViewCell", for: indexPath) as? ElevationSumTableViewCell else { 73 return UITableViewCell() 74 } 75 cell.bodyLabel.text = String(format: "%.2fm", sum) 76 return cell 77 } else { 78 guard let cell = tableView.dequeueReusableCell(withIdentifier: "ElevationListTableViewCell", for: indexPath) as? ElevationListTableViewCell else { 79 return UITableViewCell() 80 } 81 82 cell.delegate = self 83 84 if let elevation = model?[indexPath.row] { 85 cell.dateLabel.text = elevation.date 86 cell.bodyLabel.text = String(format: "%.2fm", elevation.elevation) 87 } 88 return cell 89 } 90 } 91} 92 93extension ElevationDataSource: UITableViewDelegate { 94 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 95 96 return 100 97 } 98} 99
試したこと
ModelでControllerのインスタンスを生成しさえすれば、簡単だと思うのですが。それだとMVCで書いている意味がなくなってしまうような気がして他の方法を探しましたが、見つかりませんでした。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/12 02:09
2020/09/12 03:24
2020/09/12 06:10