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

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

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

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

Q&A

解決済

1回答

134閲覧

SwiftのViewMode側でテーブルビューをリロードしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2023/11/27 08:19

実現したいこと

MVVMのViewModel側でテーブルビューをリロードしたいです。

前提

MVVMで最小のAPIアプリを作っています。
Model:構造体などの情報
ViewModel:Modelを使ってデータを取得したり、Functionをまとめたり
View:画面に関する処理のみ記述

発生している問題・エラーメッセージ

Value of type 'TableViewReloadVieModel' has no member 'reload'

該当のソースコード

Swift

1// TableViewReloadVieModel.swift 2import Alamofire 3import Foundation 4 5 6// プロトコル 7protocol TableViewReloadViewModelOutput{ 8 // テーブルビューをリロードするメソッド 9 func reload() 10} 11 12class TableViewReloadVieModel { 13 14 // 変数 15 // テーブルビュー表示用 16 var display_qiita_article: [ArticleInfo] = [] 17 18 // APIエンドポイント 19 let apiUrlString = "https://qiita.com/api/v2/items" 20 21 22 // MARK: - Function 23 func fetchQiitaArticles () { 24 25 // URLオブジェクトを生成 26 if let apiUrl = URL(string: apiUrlString) { 27 // URLセッションを作成 28 let session = URLSession.shared 29 30 // データタスクを作成してGETリクエストを送信 31 let task = session.dataTask(with: apiUrl) { data, response, error in 32 if let error = error { 33 print("Error: \(error)") 34 } else if let data = data { 35 do { 36 // 取得したデータをJSONオブジェクトにパース 37 if let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { 38 // JSONデータを利用する 39 for json in jsonArray { 40 if let title = json["title"] as? String { 41 print("Title: \(title)") 42 } 43 if let user = json["user"] as? [String: Any], let id = user["id"] as? String { 44 print("====================================") 45 print("ユーザーIDは") 46 print("User ID: \(id)") 47 print("====================================") 48 } 49 // リロードする 50 self.reload() 51 } 52 } 53 } catch { 54 print("Error: \(error)") 55 } 56 } 57 } 58 59 // データタスクを開始 60 task.resume() 61 } 62 } 63} 64

Swift

1// TableViewReloadViewController.swift 2import UIKit 3 4class TableViewReloadViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewReloadViewModelOutput { 5 6 // 接続 7 @IBOutlet var tableView: UITableView! 8 9 // インスタンス 10 let viewModel = TableViewReloadVieModel() 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 // データを取得する 16 viewModel.fetchQiitaArticles() 17 18 // デリゲート 19 tableView.dataSource = self 20 21 // カスタムセル登録 22 self.initTableView() 23 } 24 25 // MARK: - TableView 26 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 27 return viewModel.display_qiita_article.count 28 } 29 30 31 // 中身 32 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 34 let cell = tableView.dequeueReusableCell(withIdentifier: "QiitaArticleTableViewCell", for: indexPath) as! QiitaArticleTableViewCell 35 36 // 記事タイトル 37 cell.title.text = viewModel.display_qiita_article[indexPath.row].title 38 // 記事URL 39 cell.url.text = viewModel.display_qiita_article[indexPath.row].url 40 41 return cell 42 } 43 44 45 // セルの高さ 46 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 47 return 64 48 } 49 50 51 // 選択時 52 func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 53 54 print("=====================") 55 print("セルタップしたよ") 56 print("=====================") 57 print("セル番号は") 58 print(String(indexPath.row)) 59 print("=====================") 60 } 61 62 63 // MARK: - Action 64 65 @IBAction func addButton(_ sender: Any) { 66 67 } 68 69 70 // MARK: - Function 71 private func initTableView() { 72 tableView.register(UINib(nibName: "QiitaArticleTableViewCell", bundle: nil), forCellReuseIdentifier: "QiitaArticleTableViewCell") 73 } 74 75 func reload() { 76 // メインスレッドで読み込む 77 DispatchQueue.main.async { 78 self.tableView.reloadData() 79 } 80 } 81} 82 83

試したこと

色々試したのですがViewModel側でリロード出来ませんでした。
MVVM初めてなのでお手柔らかにお願いいたします。

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

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

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

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

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

hoshi-takanori

2023/11/27 20:30

ViewModel 側でデータが更新されたことを View に通知する必要があるでしょうね。やり方はいろいろ考えられますが。ちなみに、MVVM についてはどんな記事を参考にされましたか?
退会済みユーザー

退会済みユーザー

2023/11/28 05:15

> ViewModel 側でデータが更新されたことを View に通知する必要があるでしょうね。 didsetとかでしょうか?? > やり方はいろいろ考えられますが 検索すると色々出てくるので本当に困っています > MVVM についてはどんな記事を参考にされましたか? 特にこれといった記事ではなく何個か読んでみて自分なりに解釈している状況です。 なるべく複雑にならずに簡単にリロードできる実装にしたいと考えています。 よろしくお願いします。
guest

回答1

0

ベストアンサー

自己解決しました。

func fetchQiitaArticles(_ output: TableViewReloadViewModelOutput) { ... }

投稿2023/11/28 09:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問