親viewからdelegateを使って子viewでdissmissを実行したいのですが上手く行きません
現在、子viewに処理を任せる所まではlogで出来ているのを確認しました
親
swift
1 2import UIKit 3import RSKImageCropper 4 5class UserDataInputViewController: UIViewController, UIImagePickerControllerDelegate { 6 7 8 var delegate: RSKImageCropViewControllerDelegate? = nil 9 10 @IBAction func call_PhotoLibrary(_ sender: Any) { 11 if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){ 12 let pickerView = UIImagePickerController() 13 pickerView.sourceType = .photoLibrary 14 pickerView.delegate = self 15 self.present(pickerView, animated: true) 16 } 17 } 18 19 20 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 21 22 let image = info[.originalImage] as! UIImage // 選択した写真を取得する 23 self.dismiss(animated: true) 24 25 let imageCropVC = RSKImageCropViewController(image: image, cropMode: .circle) 26 imageCropVC.moveAndScaleLabel.text = "切り取り範囲を選択" 27 imageCropVC.cancelButton.setTitle("キャンセル", for: .normal) 28 imageCropVC.chooseButton.setTitle("完了", for: .normal) 29 present(imageCropVC, animated: true) 30 31 32 let buttonset = Buttonset() 33 imageCropVC.delegate = buttonset 34 self.delegate = buttonset 35 } 36}
子view
swift
1import UIKit 2import RSKImageCropper 3 4 5class Buttonset: UIViewController, UIImagePickerControllerDelegate, RSKImageCropViewControllerDelegate { 6 7 8 func imageCropViewController(_ controller: RSKImageCropViewController, didCropImage croppedImage: UIImage, usingCropRect cropRect: CGRect, rotationAngle: CGFloat) { 9 10 11 print("完了を押した後の処理") ←logでprintされている 12 13 dismiss(animated: true) ← これが機能してない?(view閉じない) 14 } 15} 16 17
ぱっと見で全体像を把握できないのでなんとなく引っかかったとこだけ、
let Buttonset = buttonset()
のところで、新しくインスタンスを作って代入してるだけに見えます
処理をさせたいインスタンス?(dissmissだから画面上に表示されてるのかな?)を捕まえてdelegateを設定してあげたらどうなるでしょうか?
それと
let Buttonset = buttonset() → let buttnSet = ButtonSet()
class buttonSet → class ButtonSet
大文字小文字に意味がありますので使い分けたほうが読む人が読みやすくまります。
buttonset を UIViewController のサブクラスにしていますが、実際には ViewController として正しく扱われてないために dismiss できないのだと思います。delegate の使い方もおかしいですし…。
回答有難うございます
> 処理をさせたいインスタンス?(dissmissだから画面上に表示されてるのかな?)
これは現在表示されているview(RSKImageCropViewController)という理解でいいでしょか?
> 捕まえて
捕まえる。というのがどうするか分からなかったのですが
let imageCropVC = RSKImageCropViewController() という事ですか?
> delegateを設定
すみませんdelegateに関する知識不足でdelegateを設定。が何処にどの様に記述したら良いか分からないのですが...
ButtonSetクラスに
let imageCropVC = RSKImageCropViewController()
imageCropVC.delegate = self とは違いますよね(試しに記述しても変わらなかった)
hoshi-takanori様 回答有難うございます
>実際には ViewController として正しく扱われてないために
サブクラスを buttonset:UIViewController → buttonset:UserDataInputViewController
に変えてみましたがダメでし正しくUIViewControllerとして扱われる為にどう変更したら良いでしょか?
> delegateの使い方もおかしい
しっかりdelegateについて学んだのが本日初めてでこの記述で唯logにprintされ他ので処理して欲しい所にアクセスは出来ているのかなと勘違いしこれで質問してしまいました
不自然な記述は正しくはどの様に記述すればよかったでしょか?
UserDataInputViewController 自体を RSKImageCropViewController の delegate にすべきで、ButtonSet はたぶん不要なんじゃないかと思います。あと、UserDataInputViewController の var delegate も不要です。
oshi-takanori様
>serDataInputViewController 自体を RSKImageCropViewController の delegate にすべき
これは以前やっていて問題なく出来ていました
今回他のクラスでもButtonSet に記述した処理をしていて重複記述していたので勉強のかねて汎用的にしたいと思いButtonSetを用意しました
汎用的というのは、いろんな画面から RSKImageCropViewController を呼び出せるように、ということですか?
>hoshi-takanori様
RSKImageCropViewControllerを呼び出した後の処理(写真切り抜き)やRSKImageCropViewControllerをdismissさせる処理を汎用的にしたいと考えています
最終的にはUIImagePickerControllerの呼び出しやRSKImageCropViewControllerの呼び出し等もしたいですが、いっぺんいいろいろやるには自分のスキルでは難しそうなのでとりあえず、呼び出した後の処理のみをやってみようと始めました。
なるほど。ってか、RSKImageCropViewController は切り抜く処理自体はやってくれないんですね…。
とりあえず、切り抜く処理そのものは関数が一つあればいいだけだし、dismiss に関しては表示した ViewController が dismiss するのが原則なので、dismiss だけを汎用化するのはあまり意味ないと思います。delegate の説明も兼ねて、RSKImageCropViewController を呼び出して処理する流れを回答に書きますよ。
>hoshi-takanori様
有難うございます
本当はdissmissの後にボタンに選択した画像のセットや切り抜きの処理がありますが
今回はdissmissする事が目的だったので、割愛させて頂きました。
(dissmissだけを汎用化のつもりではなかったです。)
RSKImageCropViewController の呼び出し`present(imageCropVC, animated: true)`や完了、キャンセルボタンのセットまでは出来ていてあとはdelegateでdissmissさせる所が出来ていない状態です
https://teratail.com/questions/245452
上の質問で RSKimageCropView のことを知って自分でもちょっと使ってみました。
こいつも処理には delegate の設定が必要なのですが、まずはその整理からやった方がいいかもしれません。
諸々の設定をやったあと、
func imageCropViewControllerDidCancelCrop(_ controller: RSKImageCropViewController)
にキャンセル時の処理を、
func imageCropViewController(_ controller: RSKImageCropViewController, didCropImage croppedImage: UIImage, usingCropRect cropRect: CGRect, rotationAngle: CGFloat)
にOkを押した時の処理を書けばいいのですが、その辺の理解はいかがでしょうか。
質問者さん:
イメージピッカーで画像を選択し、それをRSKimageCropViewで範囲選択し、内容に応じてクロップし、UIImage に貼り付けるサンプルは実はできていますが、それをみてみますか?
回答2件
あなたの回答
tips
プレビュー