Как вызвать метод из другого класса в Swift 4.0 - PullRequest
0 голосов
/ 19 января 2019

Я работаю над приложением, которое включает колесо. Я хочу выполнить функцию в другом классе, когда угловая скорость достигает 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.
    }


}

Так как бы я позвонил methodToCall из кода didSimulatePhysics?

1 Ответ

0 голосов
/ 19 января 2019

Я предполагаю, что 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) Другой способ, которым я имеювидно, что 1-й класс передается как переменная 2-му классу.

Внутри WheelDelegate добавьте глобальную переменную

var myViewController:Main?

Затем можно принять Main какпараметр при инициализации или при создании WheelDelegate вы можете сделать

var wheelDelegate = WheelDelegate()
wheelDelegate.myViewController = self

Затем внутри WheelDelegate вы можете сделать

self.myViewController.methodToCall()
...