前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。