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

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

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

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

8669閲覧

tableview周りの読み込みタイミングについて

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/11 10:23

編集2016/07/11 11:11

###前提
Tableviewで表示したい値を代入するタイミングで、わからないことがあり質問させていただきます。

jsonファイルをhttpでリクエストしてそれを展開してtableviewに代入するということを行っています。

numberOfRowsInSectionの段階で配列に入っていないため、tableviewが表示されない現象が起きております。
imgArrayに値を追加して、tableviewを表示できるようにしたいです。
ご教授いただけますと幸いです。
何卒よろしくお願い致します。

##再現手順
1.上で変数の宣言を行う。 ⬅︎この段階では空です。
2.viewDidLoadで変数に値を入れている。
3.numberOfRowsInSectionの関数が呼び出されるタイミングでは空です。

###該当のソースコード

swift

1// 2// ViewController.swift 3// 4 5import UIKit 6import SwiftyJSON 7import Alamofire 8 9class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 10 11 var jsonURLString = "test.json" 12 //画面表示用 13 @IBOutlet weak var tableView: UITableView! 14 15 var labelArray: [String] = [] 16 var imgArray: [String] = [] 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view, typically from a nib. 21 22 // JSONのパース 23 Alamofire.request(.GET, jsonURLString).responseJSON { response in 24 guard let object = response.result.value else { 25 return 26 } 27 28 let json = JSON(object) 29 json.forEach { (_, json) in 30 self.labelArray.append(json["label"].string!) 31 self.imgArray.append(json["img"].string!) 32 } 33 } 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 // Dispose of any resources that can be recreated. 39 } 40 41 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 42 return imgArray.count 43 } 44 45 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 46 // セルを取得する 47 let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("TimelineCell", forIndexPath: indexPath) 48 49 let img = UIImage(named:"\(imgArray[indexPath.row])") 50 let imageView = tableView.viewWithTag(1) as! UIImageView 51 imageView.image = img 52 53 // Tag番号 2 で UILabel インスタンスの生成 54 let artistName = tableView.viewWithTag(2) as! UILabel 55 artistName.text = "No.\(indexPath.row + 1)" 56 57 return cell 58 } 59 }

下記の関数が読み込まれるタイミングでは、まだ値が入っていないようです。

swift

1 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 2 return imgArray.count 3 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のように読み込みが終わったところで、テーブルをリロードすればいけると思います。

swift

1 2import UIKit 3import SwiftyJSON 4import Alamofire 5 6class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 7 8 var jsonURLString = "test.json" 9 //画面表示用 10 @IBOutlet weak var tableView: UITableView! 11 12 var labelArray: [String] = [] 13 var imgArray: [String] = [] 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 // Do any additional setup after loading the view, typically from a nib. 18 19 // JSONのパース 20 Alamofire.request(.GET, jsonURLString).responseJSON { response in 21 guard let object = response.result.value else { 22 return 23 } 24 25 let json = JSON(object) 26 json.forEach { (_, json) in 27 self.labelArray.append(json["label"].string!) 28 self.imgArray.append(json["img"].string!) 29 } 30 31 // 追加↓↓↓↓↓↓↓↓ 32 dispatch_async_main { 33 // メインスレッドでテーブルをリロード 34 self.tableView.reloadData() 35 } 36 } 37 } 38 39 override func didReceiveMemoryWarning() { 40 super.didReceiveMemoryWarning() 41 // Dispose of any resources that can be recreated. 42 } 43 44 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 return imgArray.count 46 } 47 48 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 49 // セルを取得する 50 let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("TimelineCell", forIndexPath: indexPath) 51 52 let img = UIImage(named:"\(imgArray[indexPath.row])") 53 let imageView = tableView.viewWithTag(1) as! UIImageView 54 imageView.image = img 55 56 // Tag番号 2 で UILabel インスタンスの生成 57 let artistName = tableView.viewWithTag(2) as! UILabel 58 artistName.text = "No.\(indexPath.row + 1)" 59 60 return cell 61 } 62} 63 64// 追加↓↓↓↓↓↓↓↓ 65func dispatch_async_main(block: () -> ()) { 66 dispatch_async(dispatch_get_main_queue(), block) 67} 68// 追加↑↑↑↑↑↑↑↑

投稿2016/07/11 11:34

編集2016/07/11 12:09
_Kentarou

総合スコア8490

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

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

退会済みユーザー

退会済みユーザー

2016/07/11 11:49 編集

ご回答いただき、ありがとうございます。 上記の内容を実装してみたのですが、上手く反映されません。 viewDidLoadの方のdispatch_async_mainなのですが、エラーが出力され dispatch_async_mainにselfをつけろと言われました。 ここでのselfがいまいち理解できていません。 1つ気になったのですが、viewDidloadの箇所でforEachで imgArrayの変数に値を代入している箇所ですが、 これは問題はないのでしょうか。 こちらに問題があるような気がしているのですが、解決方法が見いだせない状況です。
_Kentarou

2016/07/11 11:57

まず値がちゃんと取得出来ているのかを確認するのがよいので、forEachが終わった次の行に以下のprint文を書いてちゃんと中身が入っているか確認してください。 print(self.labelArray)
_Kentarou

2016/07/11 12:11 編集

ライブラリをちゃんと入れて確認しました、こちらではエラーが出ていないのでおそらくコードを入れたところが違うのかと思われます、、、 こちらが回答で貼ったコードをそのまま貼り付けて確認してください。 クラスの外に以下も記載しているので忘れずに! func dispatch_async_main(block: () -> ()) { dispatch_async(dispatch_get_main_queue(), block) }
退会済みユーザー

退会済みユーザー

2016/07/12 05:24

ご返信遅れまして申し訳ございません。 別問題で表示できていなかったみたいです。 jsonファイルが上手く実装できたため、 Tableviewに挿入する画像データの取り出し方がローカルからサーバ上に変更されたために起きた問題でした。 親身にアドバイスしていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問