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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

2回答

2847閲覧

NSDataに変換したUIImageをArrayにてUserDefaultに保存した後の読み込みが方法が分からない

Susanoo2442

総合スコア153

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/10/04 02:37

###実現したいこと

アプリを開発しておりまして
プロフィール設定画面で情報を入力して
保存ボタンを押すとその情報が保存されて
さらにその後遷移ボタンを押して
遷移するたびに
遷移先のページで先ほど入力した情報が載った
TableCellがひとつずつ増えていくといった感じの処理をしています。

そこで、テキストラベルだけでしたら
遷移するたびに、 TabelCellが増えていくのですが
これに写真も組み合わせて
遷移元で入力したテキスト内容と
選択した写真を保存して遷移ボタンを押して遷移するたびに

遷移先で先ほど入力した情報が載ったTableViewCellをひとつずつ増やしていくといったことがしたいです。

###問題点

先ほども申しましたがテキストラベルに入力した内容は遷移するごとに
遷移先のTableCellにそのテキストを乗っけてひとつずつ増やしていくことはできております。

しかし、同じようなことを写真付きでやると
アプリがエラー落ちしてしまいます。

しかしながら原因は突き止めて
おります。

まず、最初に値は全てUserDefautsにて出し入れしております。

そして、値を引き渡すための変数はReciveDataで管理しています。
このうち二つのテキストラベルにはそれぞれReciveData1とReciveData2で管理しています。
UIImageに関しましては、ReciveData3で管理しております。

そして、エラーログで確認したのですが
二つのテキストラベルに関しては

ReciveData1とReciveData2それぞれ
どちらもValueが2でした。
しかしながらUIimageのReciveData3だけ、Valueが1のままでした。

つまりValueが全て噛み合ってないことが原因だと思っています。

それが証拠に、一回目の遷移時には問題なく
写真とテキストが両方のったCellが遷移先にてきちんと追加されておりました。

###アドバイスして頂きたいこと

では、なぜ二回目からの遷移でアプリが
落ちてしまうのかと言いますとこれも断定は
出来ませんが、おそらく配列
としてきちんとUIImageを処理できてないからだと思います。

今回、二つのテキストラベルは配列として
処理をしております。

しかしながら、UIImageに関してましてはただNSDataに変換して
UserDefautに保存して
遷移先でUIImageに復元して、UserDefautsを読み込んで表示させるだけでした。

おそらくこれがいけなかったんだと思います。

そこで、UIimageをNSDataに変換した後
ArrayとしてNSDataをUserDefautsに保存しました。

ここまでは良かったのですが
次はこのNSDataをArrayとしてUserDefaultsから
読み込んでさらにUIImageに復元といった処理を書こうとしているのですが
どうも、ソースコードに赤字エラーや黄色エラーが出て

うまくいきません。

ですので、Arrayとして保存したNSDataを
Arrayとして読み込んだあとに、NSDataをUIImageに変換するといった書き方を
教えて頂ければと思います。

###該当のソースコード

Swift

1import Foundation 2import UIKit 3 4 5 6 7class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 8 9 10 11 12 var selectImage: UIImage! 13 14 15 16 var stockimage: [Data] = [] 17 18 19 20 21 22 23 var ipc: UIImagePickerController! 24 25 26 27 28 let userDefaults = UserDefaults.standard 29 30 var Savehozon: String? 31 32 var Savehozon2: String? 33 34 35 36 37 38 @IBOutlet weak var MyText: UITextField! 39 40 41 @IBOutlet weak var MyText2: UITextField! 42 43 44 45 46 47 //UserDefaultsの値をまとめて削除する 48 49 50 51 52 @IBAction func Deletkey(_ sender: AnyObject) { 53 54 let appDomain:String = Bundle.main.bundleIdentifier! 55 56 57 UserDefaults.standard.removePersistentDomain(forName: appDomain) 58 59 60 61 } 62 63 64 65 func pickImageFromLibrary() { 66 67 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) { 68 69 70 ipc = UIImagePickerController() 71 72 73 ipc.delegate = self 74 75 76 ipc.sourceType = UIImagePickerControllerSourceType.photoLibrary 77 78 79 self.present(ipc, animated: true, completion: nil) 80 81 82 83 84 } 85 86 87 } 88 89 90 91 92 @IBAction func AddPic(_ sender: AnyObject) { 93 94 95 96 pickImageFromLibrary() 97 98 99 100 101 } 102 103 104 105 106 @IBAction func AddAction(_ sender: AnyObject) { 107 108 109 110 Savehozon2 = MyText2.text! 111 112 Savehozon = MyText.text! 113 114 115 116 117 118 if var result = userDefaults.object(forKey: "ReciveSave") as? Array<String> { 119 result.append(Savehozon!) 120 121 userDefaults.set(result, forKey:"ReciveSave") 122 } else { 123 userDefaults.set([Savehozon!], forKey:"ReciveSave") 124 } 125 126 userDefaults.synchronize() 127 128 129 130 131 132 133 if var result2 = userDefaults.object(forKey: "ReciveSave2") as? Array<String> { 134 135 136 result2.append(Savehozon2!) 137 138 139 userDefaults.set(result2, forKey: "ReciveSave2") 140 141 }else { 142 143 userDefaults.set([Savehozon2!], forKey:"ReciveSave2") 144 145 } 146 147 148 userDefaults.synchronize() 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 } 178 179 180 181 override func viewDidLoad() { 182 super.viewDidLoad() 183 184 } 185 186 187 188 189 190 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 191 view.endEditing(true) 192 } 193 194 override func didReceiveMemoryWarning() { 195 super.didReceiveMemoryWarning() 196 } 197 198 199 200 201 202 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 203 204 205 206 207 208 209 selectImage = info[UIImagePickerControllerOriginalImage] as! UIImage! 210 211 212 213 214 215 216 217 if let henkan = UIImageJPEGRepresentation(selectImage!, 1){ 218 219 220 221 222 stockimage = [henkan] 223 224 225 226 227 228 229 userDefaults.set([henkan], forKey: "imageData") 230 231 232 233 } 234 235 236 237 self.dismiss(animated: true, completion: nil ) 238 239 240 241 242 243 } 244 245 246 247 248 249} 250 251 252

Swift

1import Foundation 2import UIKit 3 4 5 6class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 7 8 9 10 var ReciveData: [String] = [] 11 12 var ReciveData2: [String] = [] 13 14 var ReciveData3: [UIImage] = [] 15 16 var result3: [Data] = [] 17 18 var PassData: Data! 19 20 21 22 23 24 25 26 27 28 let userDefaults = UserDefaults.standard 29 30 31 32 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 34 35 36 37 let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for:indexPath) 38 39 let label = cell.viewWithTag(2) as! UILabel 40 41 label.text = ReciveData[indexPath.row] 42 43 44 45 46 47 let label2 = cell.viewWithTag(3) as! UILabel 48 49 label2.text = ReciveData2[indexPath.row] 50 51 52 53 let imageset = cell.viewWithTag(4) as! UIImageView 54 55 56 57 imageset.image = ReciveData3[indexPath.row] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 return cell 79 80 81 82 83 84 } 85 86 87 88 89 90 91 92 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 93 94 95 return ReciveData2.count 96 97 98 } 99 100 101 102 103 override func viewDidLoad() { 104 super.viewDidLoad() 105 106 107 108 109 110 if let result = userDefaults.object(forKey: "ReciveSave") as? Array<String>{ 111 112 113 ReciveData = result 114 115 } 116 117 118 119 120 121 if let result2 = userDefaults.object(forKey: "ReciveSave2") as? Array<String>{ 122 123 124 125 ReciveData2 = result2 126 127 128 } 129 130 131 132 133 134 135 136 137 if let result3 = userDefaults.object(forKey: "imageData") as? Array<Data>{ 138 139 140 141 142 PassData = result3 as! Data 143 144 145 146 147 let ActiveImage2: UIImage? = UIImage(data: PassData) 148 149 150 151 ReciveData3.append(ActiveImage2!) 152 153 154 155 156 157 } 158 159 160 161 162 163 } 164 165 166 167 168 169 170 override func didReceiveMemoryWarning() { 171 super.didReceiveMemoryWarning() 172 173 } 174 175 176} 177 178 179

###開発環境

Xcode8
Swift3
iMac Sierra

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

これはマズいです。

swift

1 if let result3 = userDefaults.object(forKey: "imageData") as? Array<Data>{ 2 PassData = result3 as! Data // ???

ReciveData3に画像のインスタンスを格納するにはこうすればOKかと。

swift

1 if let result3 = userDefaults.object(forKey: "imageData") as? Array<Data>{ 2 for i in 0..<result3.count { 3 let wk = UIImage(data:result3[i])! 4 ReciveData3.append(wk) 5 }

データ構造のイメージをしっかり掴んでください。がんばってください!

投稿2016/10/04 06:32

fromageblanc

総合スコア2724

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

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

Susanoo2442

2016/10/09 09:09

おかげさまで 無事できました! ありがとうございました!
guest

0

パッと見なんですが、代入時にhenkanがなぜ配列になるのかな?と思いました。

swift

1 if let henkan = UIImageJPEGRepresentation(selectImage!, 1){ 2 stockimage = [henkan] 3 userDefaults.set([henkan], forKey: "imageData")

もしかしてこうなのでは?

swift

1 if let henkan = UIImageJPEGRepresentation(selectImage!, 1){ 2 stockimage.append(henkan) 3 userDefaults.set(stockimage, forKey: "imageData")

投稿2016/10/04 03:07

fromageblanc

総合スコア2724

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

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

Susanoo2442

2016/10/04 04:27

回答ありがとうございます。 すいません。 色々やっているうちにおかしなコードになっていました。 fromageblac様のおっしゃられた通り //Swift var result3:[Data] = [] if let henkan = UIImageJPEGRepresentation(selectImage!, 1){ result3.append(henkan) userDefaults.set([result3], forKey: "imageData") //Swift に戻させて頂きました。 これで恐らくFirstViewControllerの方は 問題ないと思うのですが SecondViewControllerで 今度はData型のArrayを読み込んで Data型からUIImageに戻すための処理が分かりません。 宜しければそちらの方も教えて頂けたらと思います。 宜しくお願い致します。
fromageblanc

2016/10/04 04:53

userDefaults.set([result3], forKey: "imageData") は、userDefaults.set(result3, forKey: "imageData")なのでは?エラーログ出ませんか?
Susanoo2442

2016/10/04 05:13

回答ありがとうございます! エローログは出ませんでしたよ! []←これつけて、Array< 〇〇 > の形で読み込まないと UserDefaultで配列として保持できないから 結果的に、Cellを遷移するたびに動的に追加するっていうことが 出来ないみたいなんですよ 私のそれ以前のコーディングが悪くて出来ないのか それとも、Swiftの仕様的な問題で出来ないのかは分からないですけど・・・ しかしながら、今度はその逆でUIImageを 扱う時は、[]を外さないといけないのかもしれません。 少しやってみてみます。
fromageblanc

2016/10/04 05:21

誤解を与えてすいません。エラーログはuserDefaults.set([result3], forKey: "imageData")に対するものでなく、本件全般に関してです。setの第一引数はAnyObjectだったと思うのでここでは出ないです。
Susanoo2442

2016/10/04 05:51

回答ありがとうございます。 おっしゃる通りでした。 result3のみに戻したら前と同じように 遷移時にCellが追加されるようになりました。 しかしながら 遷移先から再び遷移元に戻り 同じようにテキストに文字をし、 写真を選択して 保存ボタンを押して 遷移ボタンを押して二回目の遷移を行うところで アプリがエラー落ちしてしまいます。 エラーログをみると テキストフィールドはValueがそれぞれ2に増えていたのに対して UIImageはValueが1のままでした。 やはり、UIImageも 遷移のたびにValueを増やそうとしたら 配列ReciveData3としてUserDefautに保存する必要があるのでしょうか?? もう少しアドバイス頂けたら嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問