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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

1回答

178閲覧

UIImageをUITableViewにUserDefaultsを使用して保存したいです。

SoichiSugimo

総合スコア13

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クリップ

投稿2019/07/07 09:52

ViewControllerのTableViewにViewController1で表示したUIImageを保存したいのですがうまくいきません。ご指導を願い致します。
UserDefaultsを使用した、ローカルでの保存です。

ViewController

Swift

1コード 2 3import UIKit 4import Photos 5 6class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 7 8 let defaults = UserDefaults.standard 9 var saveArray: Array! = [NSData]() 10 var image: UIImage! 11 12 @IBOutlet weak var tableView: UITableView! 13 14 var resultArray = [String]() 15 16 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 tableView.delegate = self 22 tableView.dataSource = self 23 24 } 25 26 27 28 override func viewWillAppear(_ animated: Bool) { 29 30 if defaults.object(forKey: "saveImage") != nil { 31 let objects = defaults.object(forKey: "saveImage") as? NSArray 32 33 saveArray.removeAll() 34 for data in objects! { 35 saveArray.append(data as! NSData) 36 } 37 } 38 tableView.reloadData() 39 } 40 41 42 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 43 44 return resultArray.count 45 46 } 47 48 func numberOfSections(in tableView: UITableView) -> Int { 49 50 return 1 51 52 } 53 54 55 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 56 57 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 58 59 cell.textLabel?.text = resultArray[indexPath.row] 60 61 return cell 62 } 63 64 65 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 66 67 return 230 68 69 } 70 71 72 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 73 74 if editingStyle == .delete{ 75 76 resultArray.remove(at: indexPath.row) 77 78 UserDefaults.standard.set(resultArray, forKey: "input") 79 80 tableView.reloadData() 81 82 } 83 84 } 85 86} 87 88 89

ViewController1

Swift

1import UIKit 2import Photos 3 4class ViewController1: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 5 6 7 let defaults = UserDefaults.standard 8 var saveArray: Array! = [NSData]() 9 var image: UIImage! 10 11 12 @IBOutlet weak var backimageView: UIImageView! 13 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 PHPhotoLibrary.requestAuthorization{ (status) in 19 20 switch(status){ 21 //場合分け 22 case .authorized: break 23 case .denied: break 24 case .notDetermined: break 25 case .restricted: break 26 27 } 28 29 } 30 31 } 32 33 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 34 35 if let pickedImage = info[.originalImage] as? UIImage 36 { 37 backimageView.image = pickedImage 38 picker.dismiss(animated: true, completion: nil) 39 } 40 41 } 42 43 44 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 45 46 picker.dismiss(animated: true, completion: nil) 47 48 } 49 50 @IBAction func openAlbum(_ sender: Any) { 51 52 let sourceType :UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary 53 54 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ 55 56 let cameraPicker = UIImagePickerController() 57 cameraPicker.sourceType = sourceType 58 cameraPicker.delegate = self 59 self.present(cameraPicker, animated: true, completion: nil) 60 61 } 62 } 63 64 65 66 @IBAction func compNext(_ sender: Any) { 67 68 //NSData型にキャスト 69 let data = image.pngData() as NSData? 70 if let imageData = data { 71 saveArray.append(imageData) 72 73 defaults.set(saveArray, forKey: "saveImage") 74 defaults.synchronize() 75 } 76 77 self.navigationController?.popViewController(animated: true) 78 79 } 80 81} 82 83

以下がStoryBoardです。

イメージ説明

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

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

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

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

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

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

guest

回答1

0

NSData,NSArrayと Data,Array が混在しているのがよくないです。

ViewController.swiftの方の viewWillAppear の実装ですが
Data型をArray に保存した [Data] で受ける必要がありそうです。
下記みたいな簡単なコード書いてみました。
この場合だと最初の画面に戻ってきた場合に [Data] のカウントが増えてました。

swift

1// ViewController.swift 2var saveArray: [Data] = [] 3 4override func viewWillAppear(_ animated: Bool) { 5 6 let defaults = UserDefaults.standard 7 if let savedArray = defaults.object(forKey: "saveImage") as? [Data] { 8 self.saveArray.removeAll() 9 self.saveArray = savedArray 10 } else { 11 defaults.set(self.saveArray, forKey: "saveImage") 12 } 13}

swift

1// ViewController1.swift 2var saveArray: [Data] = [] 3 4// 略 5 6@IBAction func saveImage(_ sender: Any) { 7 8 let defaults = UserDefaults.standard 9 let image = UIImage(named: "image") // ここは取得した画像に変える 10 if let imageData = image?.pngData(), let savedArray = defaults.array(forKey: "saveImage") as? [Data] { 11 // 一旦UserDefautlsに保存したものを消す 12 defaults.removeObject(forKey: "saveImage") 13 // saveArray に UserDefaults で取得したデータ([Data])を代入 14 self.saveArray = savedArray 15 // 今回保存する画像をアレイに追加してUserDefaultsに保存 16 self.saveArray.append(imageData) 17 defaults.set(self.saveArray, forKey: "saveImage") 18 // 保存したら前の画面に戻る 19 self.navigationController?.popViewController(animated: true) 20 } 21}

ただ resultArray が TableView のデータソースなので
saveArray のデータ数が増えても resultArray が変わらない限りセルは表示されないです。

投稿2019/07/07 11:37

編集2019/07/07 11:39
TakuyaAso

総合スコア1361

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

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

SoichiSugimo

2019/07/09 11:48

回答有難うございます。 取得した画像は具体的にどこにどのような形で入力したら宜しいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問