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で行なっていますが、解決方法にめどがつきません。どなたかご教示をお願いします。
回答2件
あなたの回答
tips
プレビュー