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

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

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

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

Swift

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

Q&A

解決済

2回答

569閲覧

【Swift,Xcode】NCMBで取得したデータがセルに表示されない

nekokichi

総合スコア54

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/12/27 13:00

編集2018/12/27 13:00

NiftyCloudからデータを取得して、それをTableViewのカスタムせるに表示させるのが目的です。

下記が完成後の画面です。

イメージ説明

しかし、実際は下記のように何も表示されません。

イメージ説明

ViewWillAppear内でNCMBからデータを取得して、それを配列(:objects)に代入して、tableView.reloadDataを実行してますのでtableViewは更新されてるはずです。

データを取得後にprintでデータを確認しているのですが..。

カスタムセルに制約をつけたり、tableViewのrowHeighと高さを合わせたりしましたが、解決しません。

どうかご協力願います。

Swift

1import UIKit 2import NCMB 3 4class DetailViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 5 6 //ObjectIDを取得 7 var objectID = "" 8 9 //ページ用のSNSURL 10 var twitterURL = "" 11 var instagramURL = "" 12 var facebookURL = "" 13 14 //NCMBUser用の配列 15 var user = NCMBUser() 16 17 //URLとコメントを持つ配列 18 var object = ["",""] 19 //配列を格納する配列 20 var objects = [[String]]() 21 22 //セルの色を格納 23 var itemColor = UIColor() 24 //NCMBに保存用のセルカラー 25 var itemColor_Save = "" 26 27 @IBOutlet weak var tableView: UITableView! 28 @IBOutlet weak var themeImage: UIImageView! 29 @IBOutlet weak var iconImage: UIImageView! 30 @IBOutlet weak var userID: UILabel! 31 @IBOutlet weak var profileText: UITextView! 32 @IBOutlet weak var twitterIcon: UIImageView! 33 @IBOutlet weak var instagramIcon: UIImageView! 34 @IBOutlet weak var facebookIcon: UIImageView! 35 36 37 override func viewDidLoad() { 38 super.viewDidLoad() 39 40 //角丸 41 iconImage.layer.cornerRadius = 50 42 //枠線 43 iconImage.layer.borderWidth = 0.5 44 //調整 45 iconImage.layer.masksToBounds = true 46 twitterIcon.layer.cornerRadius = 40 47 twitterIcon.layer.borderWidth = 0.5 48 twitterIcon.layer.masksToBounds = true 49 instagramIcon.layer.cornerRadius = 40 50 instagramIcon.layer.borderWidth = 0.5 51 instagramIcon.layer.masksToBounds = true 52 facebookIcon.layer.cornerRadius = 40 53 facebookIcon.layer.borderWidth = 0.5 54 facebookIcon.layer.masksToBounds = true 55 56 //DetailViewCellを設定 57 tableView.register(UINib(nibName: "DetailViewCell", bundle: Bundle.main), forCellReuseIdentifier: "detailcell") 58 //tableViewのセルの高さを設定 59 tableView.estimatedRowHeight = 72 60 tableView.rowHeight = 72 61 //tableViewの不要なセルを削除 62 tableView.tableFooterView = UIView() 63 64 //セルの色を取得 65 if let _ = user.object(forKey: "ItemColor") { 66 itemColor_Save = user.object(forKey: "ItemColor") as! String 67 } else { 68 itemColor_Save = "gray" 69 } 70 confirmColor2() 71 72 } 73 74 override func viewWillAppear(_ animated: Bool) { 75 super.viewWillAppear(animated) 76 77 //取得したユーザーからデータを取得 78 profileText.text = (user.object(forKey: "Profile") as! String) 79 80 userID.text = "@" + (user.userName)! 81 82 //SNSのURLを取得 83 twitterURL = user.object(forKey: "TwitterURL") as! String 84 if twitterURL != "" { 85 twitterIcon.alpha = 1.0 86 } else { 87 twitterIcon.alpha = 0.5 88 } 89 instagramURL = user.object(forKey: "InstagramURL") as! String 90 if instagramURL != "" { 91 instagramIcon.alpha = 1.0 92 } else { 93 instagramIcon.alpha = 0.5 94 } 95 facebookURL = user.object(forKey: "FacebookURL") as! String 96 if facebookURL != "" { 97 facebookIcon.alpha = 1.0 98 } else { 99 facebookIcon.alpha = 0.5 100 } 101 102 //アイテムを取得 103 objects = user.object(forKey: "Item") as! [[String]] 104 //更新 105 print(objects) 106 107 //NCMBから画像を取得 108 if let readData_theme = NCMBFile.file(withName: "theme " + user.objectId, data: nil) as? NCMBFile { 109 //テーマ画像を取得 110 readData_theme.getDataInBackground { (data, error) in 111 if error != nil { 112 print(error) 113 } else { 114 self.themeImage.image = UIImage(data: data!) 115 } 116 } 117 } else { 118 //代わりの画像を用意 119 self.themeImage.image = UIImage(named: "icons8-画像-100.png") 120 } 121 122 if let readData_icon = NCMBFile.file(withName: "icon " + user.objectId, data: nil) as? NCMBFile { 123 //アイコン画像を取得 124 readData_icon.getDataInBackground { (data, error) in 125 if error != nil { 126 print(error) 127 } else { 128 self.iconImage.image = UIImage(data: data!) 129 } 130 } 131 } else { 132 //代わりの画像を用意 133 self.iconImage.image = UIImage(named: "icons8-コンタクト-96.png") 134 } 135 136 tableView.reloadData() 137 138 } 139 140 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 141 return objects.count 142 } 143 144 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 145 let cell = tableView.dequeueReusableCell(withIdentifier: "detailcell", for: indexPath) as! DetailViewCell 146 //URLの場合 147 if objects[indexPath.row][1] != "" { 148 cell.textLabel?.textColor = UIColor.white 149 cell.backgroundImageView.backgroundColor = itemColor 150 //コメントの場合 151 } else { 152 cell.textLabel?.textColor = UIColor.black 153 cell.backgroundImageView.backgroundColor = UIColor.white 154 } 155 //セルにtitleプロパティを代入 156 cell.textLabel?.text = objects[indexPath.row][0] 157 //セルのテキストを中央揃いにする 158 cell.textLabel?.textAlignment = .center 159 160 return cell 161 } 162 163 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 164 tableView.deselectRow(at: indexPath, animated: true) 165 //もしリンクならリンク先を開く 166 if objects[indexPath.row][1] != "" { 167 openSNSLink(url: objects[indexPath.row][1]) 168 } else {} 169 } 170 171 @IBAction func menu(_ sender: Any) { 172 let alert = UIAlertController(title: "メニュー", message: nil, preferredStyle: .alert) 173 let logoutAction = UIAlertAction(title: "ログアウト", style: .default) { (action) in 174 NCMBUser.logOutInBackground({ (error) in 175 if error != nil { 176 print("logout error") 177 } else { 178 //ログアウト 179 self.syncronize() 180 } 181 }) 182 } 183 let deleteAction = UIAlertAction(title: "退会", style: .destructive) { (action) in 184 let user = NCMBUser.current() 185 user?.deleteInBackground({ (error) in 186 if error != nil { 187 print("delete error") 188 } else { 189 //ログアウト 190 self.syncronize() 191 } 192 }) 193 } 194 let cancelAction = UIAlertAction(title: "キャンセル", style: .cancel) { (action) in 195 alert.dismiss(animated: true, completion: nil) 196 } 197 alert.addAction(logoutAction) 198 alert.addAction(deleteAction) 199 alert.addAction(cancelAction) 200 self.present(alert, animated: true, completion: nil) 201 } 202 203 //各SNSのジェスチャー 204 //Twitter 205 @IBAction func tapGesture_twitter(_ sender: UITapGestureRecognizer) { 206 openSNSLink(url: user.object(forKey: "TwitterURL") as! String) 207 } 208 //Instagram 209 @IBAction func tapGesture_instagram(_ sender: UITapGestureRecognizer) { 210 openSNSLink(url: user.object(forKey: "InstagramURL") as! String) 211 } 212 //Facebook 213 @IBAction func tapGesture_facebook(_ sender: UITapGestureRecognizer) { 214 openSNSLink(url: user.object(forKey: "FacebookURL") as! String) 215 } 216 217 //SNSのリンクをsafari経由で開く 218 @objc func openSNSLink(url:String) { 219 //http,httpsかを確認 220 if url.prefix(7) == "http://" || url.prefix(8) == "https://" { 221 //文字列をURLに変換 222 let url = URL(string: url)! 223 if UIApplication.shared.canOpenURL(url) { 224 UIApplication.shared.open(url) 225 } 226 } else {} 227 } 228 229 //選択したセルの色(文字列)を取得 230 func confirmColor1() { 231 .... 232 } 233 234 //選択したセルの色(文字列)からセルの色(UIColor)を取得 235 func confirmColor2() { 236 ... 237 } 238 239 //同期する際の処理 240 func syncronize() { 241 //storyboardを宣言 242 let storyboard = UIStoryboard(name: "SignIN", bundle: Bundle.main) 243 let next = storyboard.instantiateViewController(withIdentifier: "signin") as! SignINController 244 next.modalTransitionStyle = .crossDissolve 245 self.present(next, animated: true, completion: nil) 246 //ログイン状態を解除 247 let ud = UserDefaults.standard 248 ud.set(false, forKey: "LoginStatus") 249 ud.synchronize() 250 } 251 252} 253

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

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

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

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

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

fuzzball

2018/12/28 00:37

カスタムセルを使うのをやめて、標準のUITableViewCellで試して下さい。問題を切り分けて下さい。
fuzzball

2018/12/28 00:39

tableView(_:numberOfRowsInSection:)の中に、 print(objects.count) を追加して、表示されるタイミングと値を書いて下さい。
guest

回答2

0

ベストアンサー

思い付く可能性を上げます

  • tableView.dataSourceをセットしていない
  • objectsが空(print(objects)した結果を言葉濁しているのはなぜ?)
  • tableView.isHidden=trueになっている
  • tableView.frameの高さが0

NiftyCloudは使ったことないのでそこら辺はわからないです。すみません。

投稿2018/12/27 16:49

u39ueda

総合スコア950

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

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

nekokichi

2018/12/28 02:56

delegateとdatasourceが設定されてませんでした。 設定したら解決しました。 お手数をかけて申し訳ありません。
guest

0

データ取得後にreloadData()しているように見えないのですが。

投稿2018/12/28 00:32

fuzzball

総合スコア16731

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

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

fuzzball

2018/12/28 00:35

あー、失礼。 画像の取得をデータ取得と勘違いしました。
nekokichi

2018/12/28 02:57

delegateとdatasourceを設定してなかっただけでした。 単純なミスでお騒がせて申し訳ありませんでした。
fuzzball

2018/12/28 03:00

自分で回答を書いて自己解決にすべきではないですか? あと、私の回答へのプラスは不要です。(高評価はお礼代わりにするものではないです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問