🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Q&A

1回答

464閲覧

imageviewに画像が読み込まれない

ROKIDOG

総合スコア20

Xcode

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

0グッド

0クリップ

投稿2019/11/20 03:31

編集2019/11/20 03:32

twitterを作っています。
タイムラインの時に画像を読み込みたいのですが、反映してくれません。
アイコンには画像が入るのですが、投稿のページには入ってくれません、
画像はニフティクラウドというクラウドサービスから読み込むようにしています。

画像の読み込みにはキングフィッシャーを使って cell.photoImageView.kf.setImage(with: URL(string: imageUrl))と書いています。
tableviewはTimelineTableViewCellというカスタムセルを使っています。
エラーは出ていません。

試した事
ニフクラ のアプリのIDがあっているか
imageviewが接続されているか

どなたかアドバイスお願いできませんか?

シュミレーター
![イメージ説明
storybord
イメージ説明

import UIKit import NCMB import Kingfisher import SVProgressHUD import SwiftDate class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource , TimelineTableViewCellDelegate { func didTapUserImageView(tableViewCell: UITableViewCell, gesture: UITapGestureRecognizer) { performSegue(withIdentifier: "toUserPost", sender: nil) } var selectedPost: Post? var posts = [Post]() var followings = [NCMBUser]() @IBOutlet var timelineTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() timelineTableView.dataSource = self timelineTableView.delegate = self let nib = UINib(nibName: "TimelineTableViewCell", bundle: Bundle.main) timelineTableView.register(nib, forCellReuseIdentifier: "Cell") timelineTableView.tableFooterView = UIView() // 引っ張って更新 setRefreshControl() // フォロー中のユーザーを取得する。その後にフォロー中のユーザーの投稿のみ読み込み loadFollowingUsers() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "toComments" { let commentViewController = segue.destination as! CommentViewController commentViewController.postId = selectedPost?.objectId } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return posts.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! TimelineTableViewCell cell.delegate = self cell.tag = indexPath.row let user = posts[indexPath.row].user cell.userNameLabel.text = user.userName let userImageUrl = "https://mbaas.api.nifcloud.com/2013-09-01/applications/(アプリのID)/publicFiles/" + user.objectId cell.userImageView.kf.setImage(with: URL(string: userImageUrl), placeholder: UIImage(named: "placeholder.jpg")) cell.commentTextView.text = posts[indexPath.row].text let imageUrl = posts[indexPath.row].imageUrl cell.photoImageView.kf.setImage(with: URL(string: imageUrl)) // Likeによってハートの表示を変える if posts[indexPath.row].isLiked == true { cell.likeButton.setImage(UIImage(named: "heart-fill"), for: .normal) } else { cell.likeButton.setImage(UIImage(named: "heart-outline"), for: .normal) } // Likeの数 cell.likeCountLabel.text = "(posts[indexPath.row].likeCount)件" // タイムスタンプ(投稿日時) (※フォーマットのためにSwiftDateライブラリをimport) cell.timestampLabel.text = posts[indexPath.row].createDate.string() return cell } func loadTimeline() { if NCMBUser.current() == nil{ // userのアクティブ状態を変更できたらログイン画面に移動 let storyboard = UIStoryboard(name: "SignIn", bundle: Bundle.main) let rootViewController = storyboard.instantiateViewController(withIdentifier: "RootNavigationController") UIApplication.shared.keyWindow?.rootViewController = rootViewController // ログイン状態の保持 let ud = UserDefaults.standard ud.set(false, forKey: "isLogin") ud.synchronize() } let query = NCMBQuery(className: "Post") // 降順 query?.order(byDescending: "createDate") // 投稿したユーザーの情報も同時取得 query?.includeKey("user") // フォロー中の人 + 自分の投稿だけ持ってくる query?.whereKey("user", containedIn: followings) // オブジェクトの取得 query?.findObjectsInBackground({ (result, error) in if error != nil { SVProgressHUD.showError(withStatus: error!.localizedDescription) } else { // 投稿を格納しておく配列を初期化(これをしないとreload時にappendで二重に追加されてしまう) self.posts = [Post]() for postObject in result as! [NCMBObject] { // ユーザー情報をUserクラスにセット let user = postObject.object(forKey: "user") as! NCMBUser // 退会済みユーザーの投稿を避けるため、activeがfalse以外のモノだけを表示 if user.object(forKey: "active") as? Bool != false { // 投稿したユーザーの情報をUserモデルにまとめる let userModel = User(objectId: user.objectId, userName: user.userName) let text = postObject.object(forKey: "text") as! String // 投稿の情報を取得 if postObject.object(forKey: "imageUrl") != nil { let imageUrl = postObject.object(forKey: "imageUrl") as! String let post = Post(objectId: postObject.objectId, user: userModel, text: text, imageUrl:imageUrl, createDate: postObject.createDate) } // 2つのデータ(投稿情報と誰が投稿したか?)を合わせてPostクラスにセット let post = Post(objectId: postObject.objectId, user: userModel, text: text, imageUrl: "",createDate: postObject.createDate) // likeの状況(自分が過去にLikeしているか?)によってデータを挿入 let likeUsers = postObject.object(forKey: "likeUser") as? [String] if likeUsers?.contains(NCMBUser.current().objectId) == true { post.isLiked = true } else { post.isLiked = false } // いいねの件数 if let likes = likeUsers { post.likeCount = likes.count } // 配列に加える self.posts.append(post) } } // 投稿のデータが揃ったらTableViewをリロード self.timelineTableView.reloadData() } }) } func loadFollowingUsers() { guard let currentUser = NCMBUser.current() else { // userがnilだった場合ログイン画面に移動 let storyboard = UIStoryboard(name: "SignIn", bundle: Bundle.main) let rootViewController = storyboard.instantiateViewController(withIdentifier: "RootNavigationController") UIApplication.shared.keyWindow?.rootViewController = rootViewController // ログイン状態の保持 let ud = UserDefaults.standard ud.set(false, forKey: "isLogin") ud.synchronize() return } // フォロー中の人だけ持ってくる let query = NCMBQuery(className: "Follow") query?.includeKey("user") query?.includeKey("following") query?.whereKey("user", equalTo: NCMBUser.current()) query?.findObjectsInBackground({ (result, error) in if error != nil { SVProgressHUD.showError(withStatus: error!.localizedDescription) } else { self.followings = [NCMBUser]() for following in result as! [NCMBObject] { self.followings.append(following.object(forKey: "following") as! NCMBUser) } self.followings.append(NCMBUser.current()) self.loadTimeline() } }) } }

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

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

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

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

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

guest

回答1

0

ニフティクラウドのSDKのことは知らないので、間違っていたらごめんなさい。

loadTimeline関数の中に以下の部分があります。(インデントは修正してあります)

swift

1// 投稿の情報を取得 2if postObject.object(forKey: "imageUrl") != nil { 3 let imageUrl = postObject.object(forKey: "imageUrl") as! String 4 let post = Post(objectId: postObject.objectId, user: userModel, text: text, imageUrl:imageUrl, createDate: postObject.createDate) 5} 6 7 8// 2つのデータ(投稿情報と誰が投稿したか?)を合わせてPostクラスにセット 9let post = Post(objectId: postObject.objectId, user: userModel, text: text, imageUrl: "",createDate: postObject.createDate)

この場合、if文の中のpostが使われることはなく、常に下の方のpostが使われます。このため、posts配列に入っているPost型の値はimageUrlが常に""になっているように思われます。

if文のところが、おそらくROKIDOGさんがやりたい処理になっていないのではないかと思いました。正しくはこんな感じなのではないでしょうか。

Swift

1// 投稿の情報を取得 2let imageUrl = postObject.object(forKey: "imageUrl") as? String ?? "" 3 4// 2つのデータ(投稿情報と誰が投稿したか?)を合わせてPostクラスにセット 5let post = Post(objectId: postObject.objectId, user: userModel, text: text, imageUrl: imageUrl, createDate: postObject.createDate)

投稿2019/11/20 13:54

eytyet

総合スコア803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問