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

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

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

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

Q&A

解決済

2回答

2176閲覧

エンコードされた画像データをデコードできない

udb

総合スコア25

Swift

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

0グッド

0クリップ

投稿2017/04/05 01:04

編集2017/04/06 10:07

Firebaseに保存されたエンコードされた画像データをSwiftでデコードして表示させようとしたらエラーの表示がないのに関わらずエラーが起きてアプリがクラッシュしてしまいます。

Swift3

1import UIKit 2import Firebase 3 4class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITableViewDelegate,UITableViewDataSource { 5 6 7 var items = [NSDictionary]() 8 9 let refreshControl = UIRefreshControl() 10 11 12 var passImage:UIImage = UIImage() 13 14 var nowtableViewImage = UIImage() 15 var nowtableViewUserName = String() 16 var nowtableViewUserImage = UIImage() 17 18 @IBOutlet var tableView: UITableView! 19 20 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 if UserDefaults.standard.object(forKey: "check") != nil{ 26 27 }else{ 28 29 let loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "login") 30 self.present(loginViewController!, animated: true, completion: nil) 31 32 } 33 34 tableView.delegate = self 35 tableView.dataSource = self 36 37 refreshControl.attributedTitle = NSAttributedString(string: "引っ張って更新") 38 refreshControl.addTarget(self, action:#selector(refresh), for:UIControlEvents.valueChanged) 39 tableView.addSubview(refreshControl) 40 41 42 items = [NSDictionary]() 43 loadAllData() 44 tableView.reloadData() 45 46 47 48 } 49 50 51 func refresh(){ 52 53 //データを読んでくる 54 //tableviewリロード 55 56 items = [NSDictionary]() 57 loadAllData() 58 tableView.reloadData() 59 refreshControl.endRefreshing() 60 61 } 62 63 //TableViewのデリゲートメソッド 64 func numberOfSections(in tableView: UITableView) -> Int { 65 return 1 66 } 67 68 //セルの数 69 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 70 return items.count 71 } 72 73 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 74 75 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 76 77 cell.selectionStyle = UITableViewCellSelectionStyle.none 78 79 let dict = items[(indexPath as NSIndexPath).row] 80 81 82 //プロフィール 83 let profileImageView = cell.viewWithTag(1) as! UIImageView 84 85 //デコードしたデータをUIImage型へ変換してimageviewへ反映する 86 let decodeData = (base64Encoded:dict["profileImage"]) 87 let decodedData = NSData(base64Encoded: decodeData as! String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) 88 let decodedImage = UIImage(data:decodedData! as Data) 89 profileImageView.layer.cornerRadius = 8.0 90 profileImageView.clipsToBounds = true 91 92 profileImageView.image = decodedImage 93 94 95 96 //ユーザー名 97 let userNameLabel = cell.viewWithTag(2) as! UILabel 98 userNameLabel.text = dict["username"] as? String 99 100 101 102 //投稿画像 103 let postedImageView = cell.viewWithTag(3) as! UIImageView 104 //abv 105 let decodeData2 = (base64Encoded:dict["postImage"]) 106 let decodedData2 = NSData(base64Encoded: decodeData2 as! String, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) 107 let decodedImage2 = UIImage(data:decodedData2! as Data) 108 postedImageView.image = decodedImage2 109 110 //コメント 111 let commentTextView = cell.viewWithTag(4) as! UITextView 112 commentTextView.text = dict["comment"] as? String 113 114 115 116 return cell 117 } 118 119 //データベースからデータをとってきて、配列の中に入れた 120 func loadAllData(){ 121 122 123 // https://happystagram1.firebaseio.com/ 124 125 126 UIApplication.shared.isNetworkActivityIndicatorVisible = true 127 128 let firebase = FIRDatabase.database().reference(fromURL: "https://instgram-ce25d.firebaseio.com/").child("Posts") 129 130 131 firebase.queryLimited(toLast: 10).observe(.value) { (snapshot,error) in 132 var tempItems = [NSDictionary]() 133 for item in(snapshot.children){ 134 135 let child = item as! FIRDataSnapshot 136 let dict = child.value 137 tempItems.append(dict as! NSDictionary) 138 139 140 } 141 142 self.items = tempItems 143 self.items = self.items.reversed() 144 self.tableView.reloadData() 145 146 147 UIApplication.shared.isNetworkActivityIndicatorVisible = false 148 149 } 150 } 151 152 153 // 154 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 155 156 157 let dict = items[(indexPath as NSIndexPath).row] 158 159 //エンコードして取り出す 160 let decodeData = (base64Encoded:dict["profileImage"]) 161 162 let decodedData = NSData(base64Encoded:decodeData as! String , options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) 163 let decodedImage = UIImage(data:decodedData! as Data) 164 //abv 165 nowtableViewUserImage = decodedImage! 166 167 nowtableViewUserName = (dict["username"] as? String)! 168 169 //エンコードして取り出す 170 let decodeData2 = (base64Encoded:dict["postImage"]) 171 172 let decodedData2 = NSData(base64Encoded:decodeData2 as! String , options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) 173 let decodedImage2 = UIImage(data:decodedData2! as Data) 174 nowtableViewImage = decodedImage2! 175 176 performSegue(withIdentifier: "sns", sender: nil) 177 178 179 180 //postImage 181 182 } 183 184 185 186 func openCamera(){ 187 188 189 let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera 190 // カメラが利用可能かチェック 191 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){ 192 // インスタンスの作成 193 let cameraPicker = UIImagePickerController() 194 cameraPicker.sourceType = sourceType 195 cameraPicker.delegate = self 196 self.present(cameraPicker, animated: true, completion: nil) 197 198 } 199 200 } 201 202 func openPhoto(){ 203 204 205 let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.photoLibrary 206 // カメラが利用可能かチェック 207 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary){ 208 // インスタンスの作成 209 let cameraPicker = UIImagePickerController() 210 cameraPicker.sourceType = sourceType 211 cameraPicker.delegate = self 212 self.present(cameraPicker, animated: true, completion: nil) 213 214 } 215 216 217 } 218 219 220 221 @IBAction func showCamera(_ sender: AnyObject) { 222 223 224 openCamera() 225 226 } 227 228 229 230 @IBAction func showPhotos(_ sender: AnyObject) { 231 232 openPhoto() 233 } 234 235 func imagePickerController(_ imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 236 237 if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 238 239 240 passImage = pickedImage 241 performSegue(withIdentifier:"next",sender:nil) 242 243 } 244 245 //カメラ画面(アルバム画面)を閉じる処理 246 imagePicker.dismiss(animated: true, completion: nil) 247 248 } 249 250 251 override func prepare(for segue:UIStoryboardSegue,sender:Any?){ 252 253 254 if(segue.identifier == "next"){ 255 256 257 let editVC:EditViewController = segue.destination as! EditViewController 258 editVC.willEditImage = passImage 259 } 260 261 if(segue.identifier == "sns"){ 262 263 let snsVC:SnsViewController = segue.destination as! SnsViewController 264 snsVC.detailImage = nowtableViewImage 265 snsVC.detailProfileImage = nowtableViewUserImage 266 snsVC.detailUserName = nowtableViewUserName 267 268 } 269 270 } 271 272 273 274 275 override func didReceiveMemoryWarning() { 276 super.didReceiveMemoryWarning() 277 278 279 } 280 281 282} 283

出力されるエラー

Swift

1ここからdecodeData 2/*60行ほどの画像をエンコードした文字列*/ 3 4ここからdecodedImagge 5Optional(<UIImage: 0x628000085370>, {1158, 1218}) 6Optional(nil) 7Could not cast value of type 'Swift.Optional<Any>' (0x7fb8c0b17960) to 'Swift.String' (0x112448ae0). 8(lldb)

Xcode8.3/Swift3で行なっていますが、解決方法にめどがつきません。どなたかご教示をお願いします。

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

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

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

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

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

fuzzball

2017/04/05 02:39

各行の下にprint文を追加して、decodeData、decodedData、decodedImageの値を表示して下さい。
udb

2017/04/05 22:18

キャストされるデータにnilがあると出るのですが、どのデータがnilになっていてオプショナル化させればいいかわからず困っています。
fuzzball

2017/04/05 22:21

出力の各行がどのprint文か分かるようにして下さい。
fuzzball

2017/04/05 22:24

あと、 let decodeData = (base64Encoded:dict["image"]) っておかしくないですか?コードはコピペするようにして下さい。
fuzzball

2017/04/05 23:46

print文の出力についてもお願いします。
guest

回答2

0

自己解決

Firebase側で画像が壊れている場合、もしくは空の状態になってしまった場合、エラーを出すようになったようです。コードは正確でもサーバーサイドに問題がある場合もios側でエラーを認識するようになりするようになりました。

投稿2017/04/11 03:39

udb

総合スコア25

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

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

0

これでどうでしょうか?

swift

1let decodedData = Data(base64Encoded: dict["image"], options: .ignoreUnknownCharacters) 2let decodedImage = UIImage(data: decodedData)

投稿2017/04/05 22:09

編集2017/04/06 00:14
fuzzball

総合スコア16731

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

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

fuzzball

2017/04/06 00:15

エラーなど出たら報告して下さい。
udb

2017/04/06 10:00

let decodedData = Data(base64Encoded: dict["image"], options: .ignoreUnknownCharacters) let decodedImage = UIImage(data: decodedData) 上のdecodedDataでAmbiguous reference to member subscriptの赤いエラーが出ます。
fuzzball

2017/04/06 10:09

dict["image"] as! String にしてみて下さい。
udb

2017/04/06 10:16

エラー表示は出ずクラッシュします。 let decodedData = Data(base64Encoded: dict["image"] as! String, options: .ignoreUnknownCharacters) print(decodedData) let decodedImage = UIImage(data: decodedData!) decodeImageには!をつけると警告が出ましたので付加しております Optional(<UIImage: 0x62000009ed70>, {1158, 1218}) fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)
fuzzball

2017/04/06 10:27

Optional(<UIImage: 0x62000009ed70>, {1158, 1218}) これは何の出力でしょうか?
udb

2017/04/06 10:52

let decodedImage = UIImage(data: decodedData!) print("ここからdecodedImagge") print(decodedImage) なのでdecodeImageの出力になっていると思います。 Optional(<UIImage: 0x62000009ed70>, {1158, 1218})と出力され、optionalでnilが検出されてエラーを吐いているようです。
fuzzball

2017/04/06 11:49

UIImageは生成できているようなので、落ちているのは別のところでしょう。 落ちている箇所を特定して下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問