🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

832閲覧

Swiftについて!カメラロールの画像の出力の質問です.

ren_0514

総合スコア5

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/09/07 15:40

前提・実現したいこと

swiftを用いてXcodeでiphoneアプリを作っています。
アプリの内容はカメラロールの写真を読み込んで,ViewControllerでUIcollectionviewで写真を見て,写真をタップするとPhotoViewControllerに遷移し拡大された写真が見れるという内容です.
またViewControllerの画面ではステッパーで表示する写真の枚数を変更できるようにしました.
以下のようなソースコードで実装したところ,写真をタップするとエラーが起こってしまい拡大された写真をみることができませんでした.
どこが間違っているのか,また改善したソースコードを教えてくれると幸いです.
初歩的すぎる質問で申し訳ないのですがお願いします.

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

main関数?で以下のようなエラー文がでる. class AppDelegate: UIResponder, UIApplicationDelegate で Thread 1: signal SIGABRT と表示される.

該当のソースコード

swift

1 2//ViewController.swiftのソースコード 3 4import UIKit 5import Photos 6 7class ViewController: UIViewController , UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{ 8 9 var maisu:CGFloat = 3 10 var selectedImage: UIImage? = nil 11 var toAsset : PHAsset? = nil 12 13 @IBAction func stepperDidTap(_ sender: UIStepper) { 14 maisu = CGFloat(sender.value) 15 collectionView.reloadData() 16 } 17 18 19 let manager = PHImageManager() 20 21 var photos: [PHAsset] = [] 22 23 @IBOutlet weak var collectionView: UICollectionView! 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 collectionView.delegate = self 27 collectionView.dataSource = self 28 29 PHPhotoLibrary.requestAuthorization { status in 30 if status == .authorized { 31 self.loadPhotos() 32 } 33 } 34 // Do any additional setup after loading the view. 35 } 36 37 func loadPhotos(){ 38 let result = PHAsset.fetchAssets(with: .image , options: nil) 39 let indexSet = IndexSet(integersIn: 0...result.count - 1) 40 let loadedPhotos = result.objects(at: indexSet) 41 photos = loadedPhotos 42 DispatchQueue.main.sync{ 43 collectionView.reloadData() 44 } 45 } 46 47 48 func collectionView(_ collectionView : UICollectionView , numberOfItemsInSection section : Int) -> Int { 49 return photos.count 50 } 51 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{ 52 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) 53 let asset = photos[indexPath.item] 54 let width = collectionView.bounds.size.width / (5-maisu) 55 manager.requestImage(for: asset, targetSize: CGSize(width: width, height: width), contentMode: .aspectFill, options: nil, resultHandler: { 56 result, info in if let image = result { 57 let imageView = cell.viewWithTag(1) as! UIImageView 58 imageView.image = image 59 } 60 }) 61 return cell 62 } 63 64 func collectionView(_ collectionView: UICollectionView , layout collectionViewLayout: UICollectionViewLayout , sizeForItemAt indexPath: IndexPath) -> CGSize { 65 let width = collectionView.bounds.size.width / (5-maisu) 66 return CGSize(width: width , height: width) 67 } 68 69 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout , minimumInteritemSpacingForSectionAt section: Int) -> CGFloat{ 70 return 0.0 71 } 72 73 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout , minimumLineSpacingForSectionAt section: Int) -> CGFloat{ 74 return 0.0 75 } 76 77 78 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 79 80 // [indexPath.row] から画像名を探し、UImage を設定 81 toAsset = photos[indexPath.item] 82 if toAsset != nil { 83 // SubViewController へ遷移するために Segue を呼び出す 84 performSegue(withIdentifier: "toPhotoViewController",sender: nil) 85 } 86// let width = collectionView.bounds.size.width 87// manager.requestImage(for: asset, targetSize: CGSize(width: width, height: width), contentMode: .aspectFill, options: nil, resultHandler: { 88// result, info in if let image = result { 89// self.selectedImage = image 90// } 91// }) 92// if selectedImage != nil { 93// // SubViewController へ遷移するために Segue を呼び出す 94// performSegue(withIdentifier: "toPhotoViewController",sender: nil) 95// } 96 } 97 98 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 99 if (segue.identifier == "toPhotoViewController") { 100 let photoVC: PhotoViewController = (segue.destination as? PhotoViewController)! 101 102 // SubViewController のselectedImgに選択された画像を設定する 103 photoVC.asset = self.toAsset 104 } 105 } 106} 107 108 109//PhotoViewController.swiftのソースコード 110import UIKit 111import Photos 112 113class PhotoViewController: UIViewController { 114 115 @IBOutlet weak var imageView: UIImageView! 116 var selectedImage : UIImage? = nil 117 var asset : PHAsset? = nil 118 let manager = PHImageManager() 119 120 override func viewDidLoad() { 121 super.viewDidLoad() 122 123// if let image = selectedImage{ 124// imageView.image = image 125// } 126 if let _asset = asset{ 127 let width = imageView.bounds.size.width 128 manager.requestImage(for: _asset, targetSize: CGSize(width: width, height: width), contentMode: .aspectFill, options: nil, resultHandler: { 129 result, info in if let image = result { 130 self.imageView.image = image 131 } 132 }) 133 } 134 // 画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 135 imageView.contentMode = UIView.ContentMode.scaleAspectFit 136 137 // Do any additional setup after loading the view. 138 }

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Xcodeの下段に表示されるデバッグログの内容を確認されたらいかがでしょうか?
そこに糸口が書かれていると思います。
ちょっと長めのログが出ていると思いますが、先頭の方に例外が発生した理由が書いてあったりします。

投稿2019/09/07 23:11

k2moons

総合スコア184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問