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

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

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

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2981閲覧

写真をテーブルビューにアップロードできない

surf

総合スコア17

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2017/12/26 11:32

編集2018/01/04 04:00

###前提・実現したいこと
カメラロールから選択した写真を
テーブルビューにアップロードして一覧を作りたい。

###発生している問題・エラーメッセージ

シュミレーター、実機でビルドした後に表示されるデバッグナビゲーター上で、 「0x108fb46e7 <+55>: xorl %edi, %edi」の右横に「Thread 1: signal SIGABRT」とあります。 これが理由で写真を選択した後のアップロードができないのではと考えていますが、 どこをどう直したらいいかがわかりません。

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

import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { @IBOutlet var tableView: UITableView! var resultArray = [UIImage]() override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if UserDefaults.standard.object(forKey: "douga") != nil{ resultArray = UserDefaults.standard.object(forKey: "douga") as! [UIImage] } tableView.reloadData() } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return resultArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for:indexPath) cell.imageView?.image = resultArray[indexPath.row] return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
import UIKit class AddViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet var imageView: UIImageView! //イメージが入る配列を準備する   var array = [UIImage]() override func viewDidLoad() { super.viewDidLoad() imageView.image = UIImage(named: "default.png") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //カメラロールから写真を選択する @IBAction func sentaku(_ sender: Any) {  //カメラロールの利用の可能 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { //写真を選ぶビュー let pickerView = UIImagePickerController() //写真の選択元をカメラロールに pickerView.sourceType = .photoLibrary pickerView.delegate = self //ビューに表示 self.present(pickerView, animated: true) } } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {  //選択した写真を取得 let image = info[UIImagePickerControllerOriginalImage] as! UIImage //ビューに表示する self.imageView.image = image //写真を選ぶビューを閉じる self.dismiss(animated: true) } @IBAction func add(_ sender: Any) { if UserDefaults.standard.object(forKey: "douga") != nil{ array = UserDefaults.standard.object(forKey: "douga") as! [UIImage] } //選択されたイメージを配列に入れる array.append(imageView.image!)    //配列を保存する UserDefaults.standard.set(array, forKey: "douga") self.navigationController?.popViewController(animated: true) } }

###試したこと
シュミレーター、実機での動作確認
BreakPointの設定(ただし、設定後の処理が理解できおらず・・・)

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode Version9.2

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

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

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

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

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

fuzzball

2017/12/27 00:24

落ちているのならコンソールに何かしらログが表示されているはずですが。
guest

回答1

0

ベストアンサー

##追記

http://www.atotok.com/labo/ios_dev/20111121021151.html
この記事が参考になるかと思います。
UIImageの配列をUserDefaultsに保存していたためエラーが発生していました。
UIImageを保存する場合は、一旦Data型に変換する必要があります。なので、一旦uploadしたimageをdataに変換し、そのdataを配列に入れました。参考になれば幸いです

一旦そのまま修正箇所のコードを貼りますね

AddViewController.swift
変えた点は
①インスタンス変数に、newArray: [Data]を持たせる
②addメソッド内で、UIImageの配列をuserDefaultsに入れるのではなく、[Data]の配列を入れる

swift

1// 2// AddViewController.swift 3// Swift4TodoApp1 4// 5// Created by 服部 光男 on 2017/12/25. 6// Copyright © 2017年 Hattori. All rights reserved. 7// 8 9import UIKit 10 11class AddViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 12 13 @IBOutlet var imageView: UIImageView! 14 15 var array = [UIImage]() 16 17//追加したやつ 18 var newArray = [Data]() 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 imageView.image = UIImage(named: "default.png") 23 24 } 25 26 override func didReceiveMemoryWarning() { 27 super.didReceiveMemoryWarning() 28 // Dispose of any resources that can be recreated. 29 } 30 31 32 @IBAction func sentaku(_ sender: Any) { 33// if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) { 34 // 写真を選ぶビュー 35 let pickerView = UIImagePickerController() 36 // 写真の選択元 37 pickerView.sourceType = .photoLibrary 38 pickerView.delegate = self 39 self.present(pickerView, animated: true) 40// } 41 } 42 43 // 写真を選んだ後の処理 44 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 45 // 選択した写真を取得 46 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 47 // ビューに表示 48 self.imageView.image = image 49 // ビューを閉じる 50 self.dismiss(animated: true) 51 } 52 53 54//addメソッド内を結構修正しました 55 @IBAction func add(_ sender: Any) { 56 if UserDefaults.standard.object(forKey: "douga") != nil { 57// array = UserDefaults.standard.object(forKey: "douga") as! [UIImage] 58 newArray = UserDefaults.standard.object(forKey: "douga") as! [Data] 59 } 60// array.append(imageView.image!) 61 guard let image = imageView.image else { 62 return 63 } 64 let data = UIImagePNGRepresentation(image) 65 if let dt = data { 66 newArray.append(dt) 67 UserDefaults.standard.set(newArray, forKey: "douga") 68 self.navigationController?.popViewController(animated: true) 69 } 70 } 71 72 73 /* 74 // MARK: - Navigation 75 76 // In a storyboard-based application, you will often want to do a little preparation before navigation 77 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 78 // Get the new view controller using segue.destinationViewController. 79 // Pass the selected object to the new view controller. 80 } 81 */ 82 83} 84

ViewController.swift
変えた点は
①インスタンス変数に、newResultArray: [Data]を持たせる
②viewWillAppearメソッド内で、UIImageの配列をuserDefaultsに入れるのではなく、[Data]の配列を入れる

swift

1// 2// ViewController.swift 3// Swift4TodoApp1 4// 5// Created by 服部 光男 on 2017/12/25. 6// Copyright © 2017年 Hattori. All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 12 13 @IBOutlet var tableView: UITableView! 14 15 var resultArray = [UIImage]() 16 17//追加したやつ 18 var newResultArray: [Data]! 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 tableView.delegate = self 24 tableView.dataSource = self 25 26 } 27 28//中身修正 29 override func viewWillAppear(_ animated: Bool) { 30 super.viewWillAppear(animated) 31 if UserDefaults.standard.object(forKey: "douga") != nil { 32 newResultArray = UserDefaults.standard.object(forKey: "douga") as! [Data] 33 resultArray.removeAll() 34 for d in newResultArray { 35 let image = UIImage(data: d) 36 if let i = image { 37 resultArray.append(i) 38 } 39 } 40 } 41 tableView.reloadData() 42 } 43 44 45 func numberOfSections(in tableView: UITableView) -> Int { 46 return 1 47 48 } 49 50 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 51 return resultArray.count 52 } 53 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for:indexPath) 56 cell.imageView?.image = resultArray[indexPath.row] 57 return cell 58 } 59 60 61 override func didReceiveMemoryWarning() { 62 super.didReceiveMemoryWarning() 63 // Dispose of any resources that can be recreated. 64 } 65 66 67} 68 69

投稿2017/12/26 18:31

編集2018/01/15 00:20
komo_ta

総合スコア275

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

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

surf

2017/12/30 03:45

array.append(imageView.image!)の直下にprint(imageView.image)と記載し、実行してデバッグエリアで確認しても、printにnilが入っているかどうか確認できず…。printの記載場所が間違っているのでしょうか。 ただ、エディタエリアの「0x108fb46e7 <+55>: xorl %edi, %edi」の右横に「Thread 1: signal SIGABRT」とあるので、どこかで何らかしらの不具合がおきているのは確かみたいです。
komo_ta

2017/12/30 04:23

そもそも認識として、AddViewControllerが立ち上がっており、追加ボタンを押すと、addメソッドが走るはずだがそれがうまくいてないという感じであってますか? その場合やっていただきたいこととして、 ①addメソッド内の一番最初のコードにブレイクポイントを設定してください。 ②正しくaddメソッドがiB接続できているか確認してください。
surf

2017/12/31 02:36

komoさんの認識通りなので、①と②を確認してみました。 ②は問題ありません。 ①でブレイクポイントを設定して、実行したら、デバッグエリアにerrorの文字がありました。 「・・・・・ [discovery] errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo={NSLocalizedDescription=query cancelled} (lldb)」 いろいろ調べ、以下のサイトをみたら同じようなことがおきているようです。 https://forums.developer.apple.com/thread/89874 これによると、Xcode9.1とiOS11のバグなのでしょうか・・・。
komo_ta

2017/12/31 06:29

デバックエリアも重要なのですが、ブレイクポイントでそちらのコードが呼ばれてないようですね。 ブレイクポイントはそこまで処理が通っているかどうかの確認の意味でやってもらったのですがそちらの認識は大丈夫でしょうか?(ブレイクポイント置いたらデバックエリアにログが出ると解釈をしてそうな返答でしたので。 やっていただきたいこととしては、 ①上記のコードをもう少し丁寧に直して欲しい ②IB接続が二重になってたりしないか確認 こちらをお願いしたく思います。
surf

2018/01/01 10:53

IB接続は二重になっていないと思います。警告マークはどこにも表示されていないので。 array.append(imageView.image!)を丁寧に描こうと、非オプショナル型にしようと思ったのですが、どうしても”!”をつけろとXcodeに怒られてしまいます。 以下のように直したのですが、うまくいきませんでした。 let adddouga = imageView.image array.append(adddouga!) imageView.image = "" 丁寧にという言葉の解釈は上述したように”!”を使わないでコードを書くということでいいでしょうか。
komo_ta

2018/01/02 02:45

丁寧にというのはMarkdown記法のことです。他の質問者の方のコード表記の仕方見ていただければわかるかと思います。 コード直接見たいので、githubとかにrepositoryあげてもらえれば確認します〜
surf

2018/01/04 04:31

質問を修正しました。 Markdown記法で書けているでしょうか。
komo_ta

2018/01/05 10:59

マークダウン確認できました。修正ありがとうございます。github確認しているのですが、正しくpushできてないかもです。project開くためのファイルがないので確認できません。
surf

2018/01/05 12:12

github確認してみます。
surf

2018/01/06 12:06

githubでコードを見られることを確認しました。 komoさんの方で確認できますでしょうか。 よろしくお願い致します。
komo_ta

2018/01/07 01:43

コードは見られるんですが、実際にこちらでも動かしたくローカルにプロジェクトを持ってきたのですが、必要なファイルがpushされてませんでした。 githubにいっていただいて、そのファイルをダウンロードかクローンして、ローカルに持ってきて、それをXcodeで開こうとすると、違和感に気づくのではないかと思うのですが、確認してみてください
surf

2018/01/13 09:34 編集

少しお待ちください。
komo_ta

2018/01/15 00:21

回答を追記しましたので、確認お願いします〜
surf

2018/01/16 11:17

ありがとうございます。 追記していただいたものを参考にさせてもらいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問