ボタンが押された時に他のViewControllerでメソッドを呼びたい。
Swift
1 2import UIKit 3import RealityKit 4import ARKit 5 6class ViewController: UIViewController, UIGestureRecognizerDelegate, ObjcDelegate { 7 8 let button = UIButton() 9 let button2 = UIButton() 10 11 private var arView: ARView! 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 arView = ARView(frame: view.bounds) 17 view.addSubview(arView) 18 UISetUp() 19 } 20 21 func Pressed() { 22 print("aaaaaaa") 23 let anchor = AnchorEntity() 24 anchor.position = simd_make_float3(0, -0.5, -1) 25 26 if let usdzModel = try? Entity.load(named: "teapot"){ 27 anchor.addChild(usdzModel) 28 usdzModel.generateCollisionShapes(recursive: true) 29 } 30 31 arView.scene.anchors.append(anchor) 32 33 let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer( 34 target: self, 35 action: #selector(ViewController.onTap(_:)) 36 ) 37 tapGesture.delegate = self 38 self.view.addGestureRecognizer(tapGesture) 39 } 40 41省略
Swift
1import UIKit 2 3protocol ObjcDelegate: class{ 4 func Pressed() 5} 6 7class ButtonViewController: UIViewController { 8 9 weak var delegate: ObjcDelegate? 10 11 let submit = UIButton() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 view.backgroundColor = .gray 16 UISetUp() 17 18 } 19 20 @objc func sub(_ sender: UIButton){ 21 print("tap!") 22 delegate?.Pressed() 23 } 24 25}
上記の記事を参考にプロトコルを作成し、デリゲートを介して呼び出そうとしましたが呼び出せません。
具体的にはモーダル上でボタンが押されるとsubの関数が発火しプロトコルのPressed呼ばれ違うviewでオブジェクトが生成されるというものを実装したいです。
Swiftにお詳しい方ご教授お願いいたします。
目的の ViewController が現在の ViewController とどういう関係にあるのか (前の画面か、これから呼び出す画面か、など) によってやり方は変わります。
1つ目のコードが最初のViewControllerで、2つ目のコードが1つ目のViewContollerからボタンで呼ばれたモーダル画面になります。今回実現したい事として、2つ目のViewControllerのボタンを押すと1つ目のViewContollerのPressedメソッドが呼ばれるということを行いたいです。どうかご教授お願いいたします。
モーダル遷移するコードが貼られてないので確かなことは言えませんが、ButtonViewController を生成して present する際に buttonVC.delegate = self みたいに書けばいいはず。
あと、Pressed で self.view に addGestureRecognizer するのってどうなんだろう…。(何をしたいかにもよりますが、普通は viewDidLoad で arView に addGestureRecognizer しておくのでは…。)
presentする際にvcを生成してdelegate=selfをすることで実現することができました。pressedの中身については少し見直してみます。ご丁寧に解説いただき、ありがとうございました!
回答1件
あなたの回答
tips
プレビュー