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

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

ただいまの
回答率

88.60%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,428

keroido

score 14

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

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

 環境

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/12/02 20:58

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+1

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

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

    // 撮影が完了時した時に呼ばれる
    public func imagePickerController(imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: AnyObject]) {

        if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            self.imageView.image = pickedImage
        }

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

//
//  ViewController.swift
//  MyCam
//


import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    @IBOutlet weak var camView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func takeAPicture(_ sender: UIBarButtonItem) {
//        定型句
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
            let picker = UIImagePickerController()
            picker.sourceType = UIImagePickerController.SourceType.camera
//            UINavigationControllerDelegateをアダプトしろと警告
            picker.delegate = self
            self.present(picker, animated: true)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
        self.camView.image = image
//        info.plistをチェック ここを間違えて1時間はまる
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        self.dismiss(animated: true)
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る