ボタンが押された時に他のViewControllerでメソッドを呼びたい。
Swift
import UIKit import RealityKit import ARKit class ViewController: UIViewController, UIGestureRecognizerDelegate, ObjcDelegate { let button = UIButton() let button2 = UIButton() private var arView: ARView! override func viewDidLoad() { super.viewDidLoad() arView = ARView(frame: view.bounds) view.addSubview(arView) UISetUp() } func Pressed() { print("aaaaaaa") let anchor = AnchorEntity() anchor.position = simd_make_float3(0, -0.5, -1) if let usdzModel = try? Entity.load(named: "teapot"){ anchor.addChild(usdzModel) usdzModel.generateCollisionShapes(recursive: true) } arView.scene.anchors.append(anchor) let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(ViewController.onTap(_:)) ) tapGesture.delegate = self self.view.addGestureRecognizer(tapGesture) } 省略
Swift
import UIKit protocol ObjcDelegate: class{ func Pressed() } class ButtonViewController: UIViewController { weak var delegate: ObjcDelegate? let submit = UIButton() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .gray UISetUp() } @objc func sub(_ sender: UIButton){ print("tap!") delegate?.Pressed() } }
上記の記事を参考にプロトコルを作成し、デリゲートを介して呼び出そうとしましたが呼び出せません。
具体的にはモーダル上でボタンが押されると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の中身については少し見直してみます。ご丁寧に解説いただき、ありがとうございました!
まだ回答がついていません
会員登録して回答してみよう