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

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

ただいまの
回答率

87.78%

至急案件 画面遷移 ボタン1つ(画像データと文字)

解決済

回答 1

投稿 編集

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

score 18

写真アプリに1.pngという画像データを保存しておき、文字を入力、入力した文字と、画像データのデータ名が 同じ時 に画面遷移することは可能でしょうか?

写真アプリ 1.png 2.png というデータ名で画像データを保存しておく。

今回作成しているアプリを開き、文字を入力する。「1.png」 決定ボタンをおす(このボタンのみ)

データが存在するとき、ViewController1の画面に画面遷移する。
データが存在しない場合、「データは存在しません」表示をする。

文字を入力 「2.png」 決定ボタンを押す

データが存在するとき、ViewController2の画面に画面遷移する。
データが存在しない場合、「データは存在しません」表示をする

この時のデータを保存している写真アプリは iPhoneにもともとある”写真”というアプリです。

コードとして このように書きましたがどうですか?

import UIKit

import Photos



class ViewController: UIViewController,UITextFieldDelegate{



    var alertController: UIAlertController!

    var nextimage: UIImage!

    func alert1(title:String,message:String){

           alertController = UIAlertController(title: "データが存在しません", message: "", preferredStyle: UIAlertController.Style.alert)

           alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))

           present(alertController, animated: true)

    }



    func alert2(title:String,message:String){

           alertController = UIAlertController(title: "データを入力してください", message: "", preferredStyle: UIAlertController.Style.alert)

           alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))

           present(alertController, animated: true)

    }



    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view.

        libraryRequestAuthorization()

        TextField.delegate = self

        TextField.layer.borderWidth = 1.5

        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 8, height: 5))

        TextField.leftView = paddingView

        TextField.leftViewMode = .always

        self.view.addSubview(TextField)

    }



    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }



    fileprivate func libraryRequestAuthorization() {

        PHPhotoLibrary.requestAuthorization({status in



            switch status {

            case .authorized:

                self.getAllPhotosInfo()

            case .denied:

                print("拒否されました")

            case .notDetermined:

                print("決まっていない")

            case .restricted:

                print("制限あり")

            @unknown default:

                return

            }

        })

    }



    fileprivate func getAllPhotosInfo(){

        let assets = PHAsset.fetchAssets(with: .image, options: nil)

        var isSuccses: Bool = false

        assets.enumerateObjects({ asset, _, _ in

            let name: String = asset.value(forKey: "filename")as! String



            if (self.TextField.text == name){

            isSuccses = true

                let manager = PHImageManager.default()

                manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100),

                    contentMode: .aspectFill, options: nil){

                        (image, info) -> Void in

                        self.nextimage = image



                }



            }

        })



        if isSuccses{

            self.performSegue(withIdentifier: "toViewController2", sender: nil)

            } else if (TextField.text! == "" ){

                alert2(title: "", message: "")

            } else {

                alert1(title: "",message: "")

        }

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "toViewController2"{

            let nextVC = segue.destination as! ViewController2

            nextVC.image = self.nextimage



        }

    }

    @IBOutlet weak var TextField: UITextField!



    @IBAction func Button(_ sender: UIButton) {

    getAllPhotosInfo()

    }





    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        self.view.endEditing(true)

    }



    func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    TextField.resignFirstResponder()

    }



    func textFieldShouldClear(_ textField: UITextField) -> Bool {

        return true

    }



}
import UIKit



class ViewController2: UIViewController {



    @IBOutlet weak var imageView: UIImageView!

    var image: UIImage!

    var nextVC: UIImage!

    var timer:Timer = Timer()



    override func viewDidLoad() {

        super.viewDidLoad()

        imageView.image = nextVC



         // Do any additional setup after loading the view.

         timer = Timer.scheduledTimer(timeInterval: 5.0,target: self,selector: #selector(changeView),userInfo: nil,repeats: false)



            }

            override func didReceiveMemoryWarning() {

                super.didReceiveMemoryWarning()

                // Dispose of any resources that can be recreated.

    }





    @objc func changeView() {

                self.navigationController?.popToRootViewController(animated: true)

            }



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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

iOSの写真アプリに保存されている写真および動画の操作はPhotoKitを使うのが良いかと思います。

ちょっと分かりにくいのですが、PHAssetクラスにvalue(forkey:)というメソッドがあるのでkeyに"filename"を渡してあげると写真のファイル名が取得できます。

追記

    fileprivate func getAllPhotosInfo(){
        let photoAssetss = PHAsset.fetchAssets(with: .image, options: nil)
        var isSuccses: Bool = false
        photoAssetss.enumerateObjects({ asset, _, _ in
            let name: String = asset.value(forKey: "filename") as! String

            if (TextField.text == name) {
                isSuccses = true
            }
        })

        if isSuccses {
            // 一致したので画面遷移
            self.performSegue(withIdentifier: "ViewController2", sender: nil)
        } else {
            // 一致しませんでしたエラー処理
        }
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/02/03 22:58

    ほんとにその通りです。
    プログラミングの基礎からもう一度勉強し直します。

    解像度の悪さは仕様ですか?

    キャンセル

  • 2020/02/03 23:06

    manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFill, options: nil){

    ここのtargetSizeとcontentModeを見直してください
    targetSizeはimageの高さと横幅です

    これで改善しない場合は色々ありますが今からは長くなるのであきらめましょう(笑

    キャンセル

  • 2020/02/03 23:07

    わかりました!
    最後までありがとうございました!!
    本当にありがとうございました!!

    キャンセル

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

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

関連した質問

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