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

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

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

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

Q&A

解決済

1回答

1970閲覧

Swift  別のViewControllerのメソッドを呼びたい

hrk_sgymm1193

総合スコア1

Swift

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

0グッド

0クリップ

投稿2021/12/24 17:54

ボタンが押された時に他の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}

https://swiswiswift.com/2017-07-08/

上記の記事を参考にプロトコルを作成し、デリゲートを介して呼び出そうとしましたが呼び出せません。

具体的にはモーダル上でボタンが押されるとsubの関数が発火しプロトコルのPressed呼ばれ違うviewでオブジェクトが生成されるというものを実装したいです。

Swiftにお詳しい方ご教授お願いいたします。

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

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

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

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

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

hoshi-takanori

2021/12/24 18:35

目的の ViewController が現在の ViewController とどういう関係にあるのか (前の画面か、これから呼び出す画面か、など) によってやり方は変わります。
hrk_sgymm1193

2021/12/25 02:30

1つ目のコードが最初のViewControllerで、2つ目のコードが1つ目のViewContollerからボタンで呼ばれたモーダル画面になります。今回実現したい事として、2つ目のViewControllerのボタンを押すと1つ目のViewContollerのPressedメソッドが呼ばれるということを行いたいです。どうかご教授お願いいたします。
hoshi-takanori

2021/12/25 12:59

モーダル遷移するコードが貼られてないので確かなことは言えませんが、ButtonViewController を生成して present する際に buttonVC.delegate = self みたいに書けばいいはず。 あと、Pressed で self.view に addGestureRecognizer するのってどうなんだろう…。(何をしたいかにもよりますが、普通は viewDidLoad で arView に addGestureRecognizer しておくのでは…。)
hrk_sgymm1193

2021/12/26 03:51

presentする際にvcを生成してdelegate=selfをすることで実現することができました。pressedの中身については少し見直してみます。ご丁寧に解説いただき、ありがとうございました!
guest

回答1

0

ベストアンサー

ViewControllerでbuttonViewControllerのインスタンスを持っていないので、情報が伝達しないと思いました。

以下でどうでしょう???

swift

1# 2点追記 2class ViewController: UIViewController, UIGestureRecognizerDelegate, ObjcDelegate { 3 4 let button = UIButton() 5 let button2 = UIButton() 6 7 private var arView: ARView! 8 9       private var buttonViewController = ButtonViewController() // 追記 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 arView = ARView(frame: view.bounds) 15 view.addSubview(arView) 16 UISetUp() 17 18 buttonViewController.delegate = self // 追記 19 } 20

投稿2021/12/25 01:32

Pomu3270

総合スコア280

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

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

hrk_sgymm1193

2021/12/25 02:36

ご回答ありがとうございます!試してみたのですが、情報の伝達ができていないみたいです。コンソールのprint("aaaaaaa")すら動いていない状況です。参考にしている記事が古いからなのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問