我正在开发一个涉及方向盘的应用程序。我想在旋转后角速度达到0时在另一个类中执行一个函数。
设置是我在视图控制器中嵌入了SKView。我有一个名为WheelView的类,该类与该SKView关联。
全班:https://github.com/swiftishard/wheelpractice2/blob/master/WheelView.swift 这是代码的相关部分。
class WheelDelegate: NSObject, SKSceneDelegate {
func didSimulatePhysics(for scene: SKScene) {
guard let wheelScene = scene as? WheelScene else { return }
if (wheelScene.wheel.physicsBody?.angularVelocity ?? 0.0) > 0.0 {
print(wheelScene.wheel.physicsBody?.angularVelocity)
if(wheelScene.wheel.physicsBody?.angularVelocity ?? 0.0) < 25.0 {
wheelScene.wheel.physicsBody?.angularVelocity = 0.0
if(wheelScene.wheel.physicsBody?.angularVelocity ?? 0.0) == 0.0 {
print("CALL METHOD FROM ANOTHER VIEW CONTROLLER")
}
}
}
}
}
要调用方法的主视图控制器
import UIKit
class Main: UIViewController {
func methodToCall() {
print("METHOD CALLED")
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
}
那我怎么从didSimulatePhysics代码中调用methodToCall
?
答案 0 :(得分:1)
我假设WheelDelegate
是在Main
中创建的对象。
您可以通过多种方式执行此操作:
1)我见过的最常见的方法是创建协议以及一些委托人。
在Main
类内部,在所有导入的正下方,您可以执行此操作。
protocol ViewControllerTalkingDelegate {
func methodToCall()
}
在WheelDelegate
内,将其添加为全局变量
var delegate:ViewControllerTalkingDelegate?
然后,每当您在WheelDelegate
内创建Main
let wheelDelegate = WheelDelegate()
wheelDelegate.delegate = self
然后,在底部的Main
中,您可以
extension Main:ViewControllerTalkingDelegate {
func methodToCall() {
//Do Something
}
}
现在,您可以在WheelDelegate
内进行delegate.methodToCall()
。
2)我看到的另一种方法是将第一类作为变量传递给第二类。
在WheelDelegate内部添加全局变量
var myViewController:Main?
然后,您可以在初始化时将Main
作为参数,或者在创建WheelDelegate
时就可以这样做
var wheelDelegate = WheelDelegate()
wheelDelegate.myViewController = self
然后可以在WheelDelegate
内
self.myViewController.methodToCall()