如何从Swift 4.0中的另一个类调用方法

时间:2019-01-19 01:08:54

标签: ios swift delegates nsnotificationcenter

我正在开发一个涉及方向盘的应用程序。我想在旋转后角速度达到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

1 个答案:

答案 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()