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

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

ただいまの
回答率

90.51%

  • Swift

    8715questions

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

swift 2.2 非同期通信が終わってからCollectionViewを表示するにはどうしたらいいのでしょうか

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 962

chrokurojp

score 20

swift 2.2 非同期通信が終わってからCollectionViewを表示するにはどうしたらいいのでしょうか

ストーリーボード利用しています。

もともとのサンプルではXcode内に格納した画像を扱っているのですが

http://hajihaji-lemon.com/smartphone/swift/uicolloctionviewcontroller/

Alamofireで非同期通信して取得した画像URLを利用したいです。
Alamofireでの通信が終わる前にCollectionViewの表示が終わってしまいます。

ここで確認できました。
    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
        print(self.articles.count)
        return 7
    }


解決方法をご存知の方いらっしゃいましたら教えてください。

また、他のサンプルも試していますが

https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/uicollectionviewwo-shiu

ストーリーボードを利用しない場合
cellにURLから取得した画像を入れようとすると
[.image ]プロパティが無いとエラーになるのですが
この理由もわかっていません。

ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var testNavBar: UINavigationBar!
    @IBOutlet weak var testImageView: UIImageView!

    var testTitle:String!
    var testImage:UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()

        //タイトルと画像を設定する。
        testNavBar.topItem!.title = testTitle
        testImageView.image = testImage

    }

    //ボタン押下時の呼び出しメソッド
    @IBAction func pushButton(sender: UIBarButtonItem) {

        //モーダル表示されているビューコントローラーを解放する。
        self.dismissViewControllerAnimated(true, completion:nil)
    }

}

TestCollectionViewController.swift

import UIKit

import Alamofire
import SwiftyJSON

private let reuseIdentifier = "Cell"

class TestCollectionViewController: UICollectionViewController {

    var articles: [[String: String?]] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Register cell classes
        self.collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        // Do any additional setup after loading the view.
        getArticles()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func getArticles() {
        let url :String = "https://api.flickr.com/services/rest/"

        let parameters :Dictionary = [
            "method"         : "flickr.interestingness.getList",
            "api_key"        : "86997f23273f5a518b027e2c8c019b0f",
            "per_page"       : "300",
            "format"         : "json",
            "nojsoncallback" : "1",
            "extras"         : "url_q,url_z",
            ]

        Alamofire.request(.GET, url, parameters: parameters)
            .responseJSON { response in

                guard let object = response.result.value else {
                    return
                }

                let json = JSON(object)

                json["photos"]["photo"].forEach { (_, json) in
                    let article: [String: String?] = [
                        "url_q": json["url_q"].string,
                        "url_z": json["url_z"].string
                    ]
                    self.articles.append(article)
                }
                print(self.articles)
        }
    }

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */

    // MARK: UICollectionViewDataSource

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }


    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
        print(self.articles.count)
        return 7
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
//        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)

        // Configure the cell
        //セルを取得し、イメージビューに画像を設定して返す。
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("TestCell", forIndexPath: indexPath)
        let imageView = cell.contentView.viewWithTag(1) as! UIImageView
        imageView.image = UIImage(named: "item" + String(indexPath.row) + ".png")

        return cell
    }

    //セル選択時の呼び出しメソッド
    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        //セグエを実行する。
        performSegueWithIdentifier("TestSegue", sender: nil)

    }

    //画面遷移実行前の呼び出しメソッド
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        //選択中のセルの画像を取得する。
        let index = collectionView?.indexPathsForSelectedItems()?.first
        let cell = collectionView?.cellForItemAtIndexPath(index!)
        let imageView = cell!.viewWithTag(1) as! UIImageView


        //遷移先のビューコントローラーを取得し、インスタンス変数に画像とテキストを設定する。
        let controller:ViewController = (segue.destinationViewController as? ViewController)!
        controller.testTitle = String(index!.row)
        controller.testImage = imageView.image
    }


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

func getArticles() {

  〜 省略 〜

    Alamofire.request(.GET, url, parameters: parameters)
        .responseJSON { response in

  〜 省略 〜
    print(self.articles)
    ******.reloadData()  //******はCollectionViewの変数名
    }
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.articles.count
}

これでCollectionViewは更新されないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8715questions

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