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

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

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

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

Swift

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

Q&A

2回答

2102閲覧

swift4.2で簡易なカメラアプリを実装したい

QueueuQ

総合スコア15

Xcode

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

Swift

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

0グッド

1クリップ

投稿2018/12/02 09:06

期待する動作:保存ボタンを有効にする。

エラーは起きていないので文法ミスとかではないと考えています.

環境

・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との紐付けもできています。(見た限り)

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

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

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

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

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

guest

回答2

0

「変数に何も入っていないんだろうなあ」くらいはわかるのですがどこでそうなってしまうかわかりません。

変数がどこで代入されているのかをよくご覧ください。
以下のコードで設定されていることがわかります。

swift

1 // 撮影が完了時した時に呼ばれる 2 public func imagePickerController(imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: AnyObject]) { 3 4 if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage { 5 self.imageView.image = pickedImage 6 }

ですので、上記メソッドにきているのか、条件が合致しているのか否かなどを調査されてはいかがでしょうか。撮影中ということであれば、おそらくそのメソッドに飛ぶ前に保存ボタンを押した場合には、所望のメンバ変数に設定されないので、ロジックを見直す必要があるのではないかと。(想像)

投稿2018/12/03 01:59

t_obara

総合スコア5488

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

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

0

最近になってswiftでiPadのカメラを制御する方法を勉強しています。
そこでこのページと
https://blog.codecamp.jp/programming-iphone-app-development-camera
に行き着きました。
上記のページからダウンロードできるサンプルはXcodeでswift5に簡単に変換できます。
iPad2018(iOS12.?)にて実機テストしましたが、問題なく動きました。
一応、上記のページを丸写しして自分で書いたコードを貼っておきます。

swift

1// 2// ViewController.swift 3// MyCam 4// 5 6 7import UIKit 8 9class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 10 11 @IBOutlet weak var camView: UIImageView! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 // Do any additional setup after loading the view. 16 } 17 18 @IBAction func takeAPicture(_ sender: UIBarButtonItem) { 19// 定型句 20 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) { 21 let picker = UIImagePickerController() 22 picker.sourceType = UIImagePickerController.SourceType.camera 23// UINavigationControllerDelegateをアダプトしろと警告 24 picker.delegate = self 25 self.present(picker, animated: true) 26 } 27 } 28 29 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 30 let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage 31 self.camView.image = image 32// info.plistをチェック ここを間違えて1時間はまる 33 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) 34 self.dismiss(animated: true) 35 } 36} 37 38

投稿2019/06/04 09:44

leokun

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問