在另一个类中调用函数的最佳方法是什么? (迅速)

时间:2017-02-25 14:56:37

标签: ios swift function class sprite-kit

所以,我对Swift中的类和函数有一个相当简单的问题。

让我们说我用SpriteKit制作应用程序。我有一个GameScene(SKScene),一个GameViewController(UIViewController)和一个GameViewController的主要故事板。

如果我想在GameScene上面放一个按钮,我可以将主故事板上的按钮IBOutlet连接到GameViewController。但是如何设置它,如果我触摸按钮我可以在GameScene中调用一个函数?

我是否必须通过委托来处理这个问题,还是有更简单的方法?

编辑:

详细说明,我要打电话的功能是:

  func resetScene(){
        self.removeAllActions()
        self.removeAllChildren()
    }

我试图声明为class func,但不知何故它不起作用。

3 个答案:

答案 0 :(得分:4)

基本上有四种方法可以从另一个类调用函数。

  1. 班级实例。如果您有一个say class Object 的实例,则可以在该实例上调用 Object的方法,如 myObject.buttonTapped()

  2. 通过委托:为A类创建协议并在协议中声明该方法。 A类必须具有协议的实例。在 buttonTapped 方法中调用该方法,例如 delegate.notifyButtonTapped()。在B类中,遵守协议并实施 notifyButtonTapped()方法。

  3. 通知:通过A类的 NotificationCenter 发布通知,并在B类中为该通知发布addObserver。请查看this链接以获取更多信息。

  4. 关闭/阻止:在这种情况下,关闭不是最好的解决方案,它们可能相当复杂,无法完全理解
  5. 你可以在这里与代表团一起去。从rw检查this link 以获得澄清。

答案 1 :(得分:3)

我不喜欢你重置SKScene的方式,通常你可以呈现相同的场景以获得真正清洁的场景,但我不知道你的代码所以也许我&# 39;我错了。

关于如何访问场景的 viewController ,您可以找到许多方法,例如 protocol / delegate 方法,但另外一种方法可能是:< / p>

extension UIView {
    func getViewController<T: UIViewController>() -> T? {
        var responder = self.next
        while responder != nil {
            if let viewController = responder as? T {
                return viewController
            }
            responder = responder!.next
        }
        return nil
    }
}

使用它:

if let gameVC = self.view?.getViewController(), gameVC is GameViewController {
    let vc = gameVC as! GameViewController
    print("That's all folks \(vc)")
}

答案 2 :(得分:0)

在这里做出假设,如果你的GameViewController包含对你的GameScene的引用,那么你可以很容易地做到这一点。您可以使用给定的方法名称buttonTapped创建IBAction引用。在此方法中,您可以在GameScene上调用一个执行您要执行的操作的方法

// GameViewController
@IBAction func buttonTapped(sender: UIButton) {
   self.gameScene.reactionMethod()
}

// GameScene
public func reactionMethod() {
   // TODO: Do actions here
}