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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

390閲覧

structを用いたAPIの取得<Qiita App>

Narikura

総合スコア6

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/10/11 01:35

編集2020/10/11 12:44

前提・実現したいこと

structを用いてTableViewに記事の名前(title),ユーザー名(Id)を表示させ、タップするとWebページに画面遷移するというものです。

TableViewCellにはtitleとIdのLabelを設定しております。

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

TableViewに記事及びIdが表示されない。(エラーコードの表示もなし)

該当のソースコード

ViewController

1 2import UIKit 3import Alamofire 4import SwiftyJSON 5import WebKit 6 7struct articlesStruct { 8 var title, userId, url: String 9} 10 11 12 13class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 14 15 @IBOutlet weak var tableView: UITableView! 16 var articles: [articlesStruct] = [] 17 let cellId = "cellId" 18 19 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 24 tableView.frame.size = view.frame.size 25 tableView.delegate = self 26 tableView.dataSource = self 27 28 navigationItem.title = "Qiita Client" 29 getQiitaApi() 30 } 31 32 func getQiitaApi(){ 33 AF.request("https://qiita.com/api/v2/items?page=1&per_page=20", method: .get).validate().responseJSON { response in 34 switch response.result { 35 case .success(let value): 36 let json = JSON(value) 37 json.forEach {(_, json) in 38 if let titleData = json["title"].string, 39 let userData = json["user"]["id"].string, 40 let urlData = json["url"].string { 41 let Data = articlesStruct(title: titleData, userId: userData, url: urlData) 42 self.articles.append(Data) 43 } 44 } 45 self.tableView.reloadData() 46 case .failure(let error): 47 print(error) 48 } 49 } 50 } 51 52 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 53 return articles.count 54 } 55 56 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 57 let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell 58 cell.title?.text = articles[indexPath.row].title 59 cell.userName?.text = articles[indexPath.row].userId 60 return cell 61 } 62 63 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 64 if segue.identifier == "ViewController2" { 65 if let VC2 = segue.destination as? ViewController2 { 66 if let url = sender as? String { 67 VC2.url = url 68 } 69 } 70 } 71 } 72} 73 74

TableViewCell

1 2import UIKit 3 4class TableViewCell: UITableViewCell { 5 6 @IBOutlet weak var title: UILabel! 7 @IBOutlet weak var userName: UILabel! 8} 9

試したこと

TableViewCellへのLabel設置&Storyboardへの紐付け
title, userId, urlのstruct 作成
numberOfRowsInSectionの個数(今回はarticles.count)
cellForRowAtでのtitle&userIdの記述
cell.title?.text = articles[indexPath.row].title(useidも同様)
main.storyboadでのTableViewCellのidentifier設定
dataSource&delegateの設定(TableViewController)

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

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

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

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

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

TsukubaDepot

2020/10/11 07:23

コードと試されたことを拝見する限り、StoryBoard を使ってカスタムセルを作り、それを表示することと、コードベースで TableView を作り、そこにカスタムセルを登録し表示することを混同されているように感じます。 実際はどちらで実施されたいのでしょうか。
Narikura

2020/10/11 07:45

確かに混同しておりました、ご指摘ありがとうございます。今回はstoryboardでの実装を行う予定でした。
Narikura

2020/10/11 08:17 編集

let tableView: UITableView = UITableView() view.addSubview(tableView)を消去し @IBOutlet weak var tableView: UITableView!に書き換えましたが変化はありませんでした。
TsukubaDepot

2020/10/11 09:43

viewDidLoad に tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId) で登録して let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell では別の identifire で登録した UITableViewCell を出力しようとしていますが、実際に行われたいのはどちらの方でしょうか。
Narikura

2020/10/11 11:50 編集

TableViewCellの方を利用したいのでそちらで統一したいです。また、質問時のregisterとはUITableViewCellと書かれていましたが、その後TableViewCellに変更しておりますが変化はありませんでした。記述が不十分でした、すみません。
TsukubaDepot

2020/10/11 12:32

StoryBoard でカスタムセルを作り、identifier を設定したのであれば、register は不要ですので、削除してみてもらえますでしょうか。 ちなみに、全体的なロジックには問題ありませんので、カスタムセルがきちんと表示されないだけの問題です。
Narikura

2020/10/11 12:39 編集

ご返信ありがとうございます。registerをを消去いたしましたが変化はありませんでした。 ということになると、Main.storyboad上での接続に不備があるという認識でよろしいでしょうか。
Narikura

2020/10/11 12:45

修正を行なったコードを含めソースコードを現状のものに更新いたしました。
TsukubaDepot

2020/10/11 13:02

接続に不備があると、おそらく実行時エラーになるかと思います。 どちらかというと、カスタムセル内に配置した UILabel の制約がおかしい、ということはないでしょうか。
Narikura

2020/10/11 13:09 編集

ご返信ありがとうございます。UILabelの制約というのはAuto layoutのエラー(警告)出ていなくてもということでしょうか。 少し変更を加えてみます。
TsukubaDepot

2020/10/11 13:27

いいえ、そういう意味ではありません。 制約にエラーがなくとも、正しい制約をつけていなければ予想外の場所に表示されることがある、という意味です。
Narikura

2020/10/11 13:44 編集

理解しました。ありがとうございます。その場合は余白を余裕にとる、ラベルのフォントを小さめに設定するなどという対処方法になるのでしょうか。 ちなみにですが、現在の制約では四方向からContentViewからの距離を定義する設定をしております。 制約を左側及び上側だけにし、横方向は左からの距離で再定義しても変化はありませんでした。
TsukubaDepot

2020/10/11 15:55

たとえば、ContentView の背景を透明ではなく、なんらかの色を付けてみるとどのような感じになりますでしょうか。 正常に動けば、最初は白色の tableView (表示するセルがないため)、データの取得が完了し、reloadData() が呼び出されれば色のついたセルが表示されるはずです。
Narikura

2020/10/11 16:03

ご返信ありがとうございます。ContentViewに色を付けてビルドを行なって見ましたが、色のついたセルは表示されませんでした。
TsukubaDepot

2020/10/11 16:13

ご提示いただいているコードほぼそのままで、かつカスタムセルを作ってやっていますが、きちんと動いています。 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) この delegate は間違いなく呼ばれているのでしょうか。 この delegate の中にprint() で何か適当な文字列を入れてみたら、Qiita API からデータが読み込まれたタイミングでなんらかの表示が出ると思いますが、それはどんな感じでしょうか。
Narikura

2020/10/12 02:09

ご返信ありがとうございます。該当箇所にprintを記載しましたが、コンソールには出力されませんでした。ということになると、delegateの設定ということでしょうか。
TsukubaDepot

2020/10/12 05:01

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return articles.count } こちらに print でなんらかのメッセージを表示させるようにしたらどうでしょうか。 こちらであれば、最低一回は呼び出されるはずなので、なんらかの表示があるはずです。
Narikura

2020/10/12 05:27

ご返信ありがとうございます。あれから進展があり、コンソールへの出力は可能になりましたが、背景色とLabelの表示はまだできておりません。
TsukubaDepot

2020/10/12 06:47

そうなると、やはりカスタムセルの設定でどこかがおかしいのだと思います。 たとえば、一度別に新しいプロジェクトを作り、コードだけ貼り付け(コードは正しく動いているのがわかっているため)、カスタムセルや TableView だけ作り直してみたらどうでしょうか。 いままでの試行錯誤で少し整理できているはずですので、作り直しといっても時間はさほどかからないと思います。
Narikura

2020/10/14 04:38

ご指摘いただきありがとうございます。あれから試行錯誤の末TableViewを表示させることができました。ありがとうございました。 最後はご指摘いただいていたregisterを消去した結果出力することができました。(ご指摘いただいた直後の状態でregisterを消去しても改善されなかったのでコードを記述したままにしておりました) 手厚いご支援に感謝致します。
TsukubaDepot

2020/10/14 08:51

とりあえず解決したようで良かったです。 UITableView の作成は複雑に見えても、何度かやっていくとかなり簡単に実装できることに気づかれると思います。 次回、また詰まったとしても、一度新規プロジェクトを立ち上げ、わかっている範囲から一つずつコードを書いていき、実行してたしかめてみるのも良いのではないでしょうか。
TsukubaDepot

2020/10/14 08:52

このままだと質問状態で残ってしまいますので、簡単な内容で良いので自己解決していただければと思います。
guest

回答2

0

コードベースではなくmain.Storyboardで実装する時registerの定義は消去する。また作り直してみる

投稿2020/10/24 06:04

Narikura

総合スコア6

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

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

0

自己解決

コードベースではなくmain.Storyboardで実装する時registerの定義は消去する。また作り直してみる

投稿2020/10/24 04:54

Narikura

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問