期待する動作:保存ボタンを有効にする。
エラーは起きていないので文法ミスとかではないと考えています.
環境
・MacOS :10.13.6
・Xcode :10.1
・swift :4.2
概要
http://kiyohime.hatenablog.com/entry/2016/04/20/131537
上記の記事でiphoneのカメラアプリを作ろうと思ったのですが手順通りに進めても保存ボタンが機能しません。(具体的にはif else文通りに「"image Failed !"」と表示される)
ソースコードの「//写真を保存」のあたりで
if image != nil ....
else{
showAlert(title: "", message: "image Failed !")
となっているので「変数に何も入っていないんだろうなあ」くらいはわかるのですがどこでそうなってしまうかわかりません。
※上記の記事ではswift2を使っていたので自分はXcodeのエラーに言われるままswift4.2に合うよう修正してあります。
該当のソースコード
import UIKit // 参考:h ttp://kiyohime.hatenablog.com/entry/2016/04/20/131537 class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { // 撮影画像の表示View @IBOutlet var imageView : UIImageView! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // カメラの撮影開始 @IBAction func cameraStart(sender : AnyObject) { let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.camera // カメラが利用可能かチェック if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera){ // インスタンスの作成 let cameraPicker = UIImagePickerController() cameraPicker.sourceType = sourceType cameraPicker.delegate = self self.present(cameraPicker, animated: true, completion: nil) } else{ showAlert(title: "", message: "Error of the camera function.") } } // 撮影が完了時した時に呼ばれる public func imagePickerController(imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: AnyObject]) { if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { self.imageView.image = pickedImage } //閉じる処理 imagePicker.dismiss(animated:true, completion: nil) } // 写真を保存 @IBAction func savePic(sender : AnyObject) { let image:UIImage! = imageView.image if image != nil { UIImageWriteToSavedPhotosAlbum(image, self, Selector(("image:didFinishSavingWithError:contextInfo:")), nil) } else{ showAlert(title: "", message: "image Failed !") } } // 撮影がキャンセルされた時に呼ばれる func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated:true, completion: nil) } // 書き込み完了結果の受け取り func image(image: UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutableRawPointer) { if error != nil { showAlert(title: "", message: "Failed to save the picture.") } else { showAlert(title: "", message: "The picture was saved.") } } // アラートを表示する func showAlert(title: String, message: String) { let alertView = UIAlertView() alertView.title = title alertView.message = message alertView.addButton(withTitle:"OK") alertView.show() } }
試したこと
「// 撮影が完了時した時に呼ばれる」の部分のfunc宣言をprivateからpublicに変更しました。(挙動に変化は見られませんでしたがprivateにしてるせいで動いてないんじゃない?と思ったので)
補足情報
・カメラは機能します
・info.plistのPrivacy - Camera Usage Description設定などはすでにしてあります。
・Main.storyboardとの紐付けもできています。(見た限り)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。