前提・実現したいこと
swiftでカメラロール(フォトライブラリ)から写真を取得する機能を実装したいです。
TableViewのCellボタンを設置し、そのボタンをトリガーとします。TableViewにはxibファイルを用いて表示させます。
発生している問題・エラーメッセージ
エラーメッセージ
Fatal error: Unexpectedly found nil while unwrapping an Optional value
該当のソースコード
↓PhotoLibraryManager.swift
swift
1import Foundation 2import Photos 3 4struct PhotoLibraryManager{ 5 6 var parentViewController : UIViewController! 7 8 init(parentViewController: UIViewController){ 9 self.parentViewController = parentViewController 10 } 11 12 // 写真へのアクセスがOFFのときに使うメソッド 13 func requestAuthorizationOn(){ 14 // authorization 15 let status = PHPhotoLibrary.authorizationStatus() 16 if (status == PHAuthorizationStatus.denied) { 17 //アクセス不能の場合。アクセス許可をしてもらう。snowなどはこれを利用して、写真へのアクセスを禁止している場合は先に進めないようにしている。 18 //アラートビューで設定変更するかしないかを聞く 19 let alert = UIAlertController(title: "写真へのアクセスを許可", 20 message: "写真へのアクセスを許可する必要があります。設定を変更してください。", 21 preferredStyle: .alert) 22 let settingsAction = UIAlertAction(title: "設定変更", style: .default) { (_) -> Void in 23 guard let _ = URL(string: UIApplication.openSettingsURLString ) else { 24 return 25 } 26 } 27 alert.addAction(settingsAction) 28 alert.addAction(UIAlertAction(title: "キャンセル", style: .cancel) { _ in 29 // ダイアログがキャンセルされた。つまりアクセス許可は得られない。 30 }) 31 self.parentViewController.present(alert, animated: true) 32 } 33 } 34 35 func callPhotoLibrary(){ 36 //権限の確認 37 requestAuthorizationOn() 38 39 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary) { 40 41 let picker = UIImagePickerController() 42 picker.modalPresentationStyle = UIModalPresentationStyle.popover 43 picker.delegate = self.parentViewController as? UIImagePickerControllerDelegate & UINavigationControllerDelegate 44 picker.sourceType = UIImagePickerController.SourceType.photoLibrary 45 //以下を設定することで、写真選択後にiOSデフォルトのトリミングViewが開くようになる 46 //picker.allowsEditing = true 47 if let popover = picker.popoverPresentationController { 48 popover.sourceView = self.parentViewController.view 49 popover.sourceRect = self.parentViewController.view.frame // ポップオーバーの表示元となるエリア 50 popover.permittedArrowDirections = UIPopoverArrowDirection.any 51 } 52 self.parentViewController.present(picker, animated: true, completion: nil) 53 } 54 } 55} 56
↓ProfileTableViewCell.swift
swift
1import UIKit 2 3class ProfileTableViewCell: UITableViewCell, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 4 5 @IBOutlet weak var userImageView: UIImageView! 6 var photoLibraryManger: PhotoLibraryManager! 7 8 override func awakeFromNib() { 9 super.awakeFromNib() 10 } 11 12 override func setSelected(_ selected: Bool, animated: Bool) { 13 super.setSelected(selected, animated: animated) 14 } 15 16 @IBAction func buttonTapped(_ sender: Any) { 17 print("ボタンがタップされました") 18 photoLibraryManger.callPhotoLibrary() 19 } 20} 21
試したこと
下記記事を参考に実装していますが、エラーが発生し解決できないでいます。
https://qiita.com/tetsufe/items/9ff5fe190ee190afa1bb
info.plistも変更しています。
回答2件
あなたの回答
tips
プレビュー