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

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

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

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

Swift

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

Q&A

1回答

917閲覧

DKImagePickerで画像を複数選択したあと画面遷移したい

Y.Kame

総合スコア13

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/05/05 21:26

編集2020/05/06 07:42

前提・実現したいこと

DKImagePickerControllerを使って複数の画像を選択したあと、画面遷移がしたいです。
通常のUIImagePickerの場合、

発生している問題・エラーメッセージ

//写真が選択されたときに呼ばれるアクション func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { //ここで画面遷移 }

したら解決するんですが、DKImagePickerControllerを使用している場合、どのように記述したらよいのでしょうか・・・

DKImagePickerで取得した複数のImageを.fetchする際のfor-in文の中でSegue(画面遷移)を書いたら画面遷移自体はしてくれるんですが1枚目の画像を読み込んだタイミングで遷移するので、残りの画像のデータが付いてきません・・・

for-in(ループ)処理が終わったタイミングで遷移したいのですが、どこに書いたらいいのでしょうか・・・

@IBAction func CreateAlbumButton(_ sender: Any) { let dialog = UIAlertController(title: "アルバムの作成", message: nil, preferredStyle: .actionSheet) dialog.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)) dialog.addAction(UIAlertAction(title: "フォトライブラリから選択", style: .default) { (action) in if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) == true { let pickerController = DKImagePickerController() pickerController.maxSelectableCount = 20 //選択可能枚数をセット pickerController.sourceType = .photo //モードをライブラリモードに設定(/camera) pickerController.showsCancelButton = true //キャンセルボタンを有効化 pickerController.assetType = .allPhotos pickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in for asset in assets { asset.fetchFullScreenImage(completeBlock: { (image, info) in self.albumimages.append(image!) print("画像をalbumimagesに格納") self.performSegue(withIdentifier: "goSecond", sender: nil) }) } } self.present(pickerController, animated: true){} } }) self.present(dialog, animated: true, completion: nil) //ダイアログを表示 }

補足情報(FW/ツールのバージョンなど)

XCODE11
Swift

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

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

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

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

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

popai306

2020/05/06 01:34

「DKImagePickerで取得した複数のImageを.fetchする際のfor-in文の中でSegue(画面遷移)を書いたら画面遷移自体はしてくれるんですが1枚目の画像を読み込んだタイミングで遷移するので、残りの画像のデータが付いてきません・・・」 ここに該当するソースコード貼ってもらえますか?
Y.Kame

2020/05/06 07:43

コメントありがとうございます。 ボタンをタップしたときのコードを追加しました!! どうぞよろしくお願いします(涙)
guest

回答1

0

私はここのサイトを参考に配列が規定値(今回の場合は20)になるまで処理を待つ、という実装をしました。
https://qiita.com/asashin227/items/9fe627609bcfcba023d9

albumimagesは配列ですよね?

私のコードの一部を抜粋しました。
参考になれば幸いです。

swift

1//コラージュボタンを押下したときの処理 2 @IBAction func collageButtonDidtap(sender: AnyObject) { 3 self.pickImages() 4 // imageArray配列の要素が4になるまで処理を待つ 5 wait( { self.imageArray.count < 4 } ) { 6 // 取得しました 7 print("finish") 8 DispatchQueue.global(qos: .default).async { 9 let resultImg = OpenCVManager.shared()?.collageImage(self.imageArray[0], image2: self.imageArray[1], image3: self.imageArray[2], image4: self.imageArray[3]) 10 DispatchQueue.main.async { 11 self.doneRetouch(image: resultImg) 12 } 13 } 14 } 15 } 16 17 // 写真を選択する 18 func pickImages() { 19 let picker = DKImagePickerController() 20 //選択できる写真の最大数を指定 21 picker.maxSelectableCount = 4 22 //カメラモード、写真モードの選択 23 picker.sourceType = .photo 24 //キャンセルボタンの有効化 25 picker.showsCancelButton = true 26 //UIのカスタマイズ 27 picker.UIDelegate = CustomUIDelegate() 28 picker.didSelectAssets = { (assets: [DKAsset]) in 29 for asset in assets { 30 asset.fetchFullScreenImage(completeBlock: { (image, info) in 31 self.imageArray.append(image!) 32 }) 33 } 34 } 35 // 36 self.present(picker, animated: true, completion: nil) 37 } 38 39 /// 条件をクリアするまで待つ関数 40 /// 41 /// - Parameters: 42 /// - waitContinuation: 待機条件 43 /// - compleation: 通過後の処理 44 private func wait(_ waitContinuation: @escaping (()->Bool), compleation: @escaping (()->Void)) { 45 var wait = waitContinuation() 46 // 0.01秒周期で待機条件をクリアするまで待ちます。 47 let semaphore = DispatchSemaphore(value: 0) 48 DispatchQueue.global().async { 49 while wait { 50 DispatchQueue.main.async { 51 wait = waitContinuation() 52 semaphore.signal() 53 } 54 semaphore.wait() 55 Thread.sleep(forTimeInterval: 0.01) 56 } 57 // 待機条件をクリアしたので通過後の処理を行います。 58 DispatchQueue.main.async { 59 compleation() 60 } 61 } 62 }

投稿2020/06/02 15:34

yamaji1108

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問