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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

2908閲覧

SDWebImageで初回に画像が表示されない

mi-na

総合スコア12

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

1グッド

1クリップ

投稿2016/08/17 00:43

編集2016/08/18 00:03

iPhoneアプリをxcodeで作成しています。

画像とタイトルを一覧表示し、一覧をクリックすると詳細ページに遷移して画像・タイトル・説明を表示しようとしています。
一覧ページも詳細ページも同じ画像を使用するため、swiftのSDWebImageを使うことにしました。

以下のサイトを参考にし、2つのパターンで画像を取得する方法を試しました。
http://blog.ch3cooh.jp/entry/20160115/1452819720

swift

1let url = NSURL(string: "http://example.com/hogehoge.jpg")! 2self.thumbnailView.sd_setImageWithURL(url, placeholderImage: nil) { (image, error, cacheType, u) -> Void in})

swift

1let url = NSURL(string: "http://example.com/hogehoge.jpg")! 2SDWebImageManager.sharedManager().downloadImageWithURL(url, 3 options: .CacheMemoryOnly, progress: nil) { [weak self] (image, error, cacheType, isDownloaded, u) -> Void in 4 // ダウンロードが完了後に加工してImageViewに設定する 5 self?.imageView.image = image.effectImage() 6}

しかし、どちらのパターンでも同じ現象だったのですが、
アプリ起動直後に表示した一覧では画像が表示されませんでした。
一覧クリックで遷移した詳細ページには画像は表示されます。
一旦アプリを終了し、再度起動した時には一覧にも画像は表示されました。

キャッシュだから2回目以降の表示は問題ないのかと思いますが、
1回目でも画像を表示するにはどうすればいいのでしょうか?
「SDWebImage」で検索しても初回は別の方法で表示しなければいけない等は見つけられませんでした。

よろしくお願いします。


以下の箇所で実行しています。

swift

1class XXXXList: UIViewController, UITableViewDelegate, UITableViewDataSource { 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 ((省略)) 5 } 6 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 7 // 再利用するCellを取得する. 8 let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) 9 10 cell.textLabel!.text = "表示するタイトル" 11 12 let url:NSURL = NSURL(string: "画像のurl")! 13 cell.imageView!.sd_setImageWithURL(url) 14 15 return cell 16 } 17}
ikuwow👍を押しています

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

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

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

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

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

fuzzball

2016/08/17 06:32 編集

このコードはどこで実行しているのでしょうか?
fuzzball

2016/08/17 06:55

コードは質問欄に書いて下さい。
mi-na

2016/08/17 07:01

すみません。 投稿後に気づいたので追記しました。
guest

回答2

0

ベストアンサー

画像の読み込み完了時にレイアウトを更新させます。

swift

1cell.imageView!.sd_setImageWithURL(url, completed: { (_, error, _, _) in 2 if error == nil { 3 cell.setNeedsLayout() 4 } 5})

これで最初に表示されるようになりました。
(カスタムセルだと、何もしなくても勝手に更新されるようなのですが‥?)

検証中に気になったのですが、今のままだと、画像の読み込み中にセルが再利用されてしまうと画面が乱れるような気がします。(激しくスクロールさせたときなど)

セルの再利用時には読み込みをキャンセルしないといけませんが、それはまた別の問題ということで‥。

投稿2016/08/17 08:57

fuzzball

総合スコア16731

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

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

mi-na

2016/08/18 00:43

ありがとうございます。 初回でも画像が表示されるようになりました。 今のところ何ページにも渡るようなリストではないので(3〜6行ほど)激しくスクロールはないと思いますが、懸念事項として頭に入れておきます。 今回の件については解決しましたので、ベストアンサーとさせて頂きます。 ありがとうございました。
guest

0

試しにですがクロージャーの無いメソッドで以下のように記述するとどうですか?

swift

1let url = NSURL(string: "http://example.com/hogehoge.jpg")! 2self.thumbnailView.sd_setImageWithURL(url) 3

投稿2016/08/17 04:04

_Kentarou

総合スコア8490

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

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

mi-na

2016/08/17 05:22

試してみましたが、起動直後の1回目は画像が表示されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問