【问题标题】:The best way to call a function inside another class? (Swift)在另一个类中调用函数的最佳方法是什么? (迅速)
【发布时间】:2017-07-16 09:41:47
【问题描述】:

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

假设我用 SpriteKit 制作了一个应用程序。我有一个 GameScene (SKScene)、一个 GameViewController (UIViewController) 和一个用于 GameViewController 的主情节提要。

如果我想在我的 GameScene 顶部有一个按钮,我会将一个按钮 IBOutlet 从主情节提要连接到 GameViewController。但是我该如何设置它,这样如果我触摸按钮,我就可以调用 GameScene 中的函数?

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

编辑:

详细来说,我想调用的函数是:

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

我试图声明为class func,但不知何故,它并不完全奏效。

【问题讨论】:

  • 你可以全局声明你的函数

标签: ios swift function class sprite-kit


【解决方案1】:

基本上有四种方法可以从其他类调用函数。

  1. 类的实例。如果你有一个类 Object 的实例,你可以像 myObject.buttonTapped() 一样在该实例上调用 Object 的 方法。

  2. 通过委托:为类 A 创建一个协议,并在协议中声明该方法。 A 类必须有一个协议实例。在 buttonTapped 方法中调用该方法,如 delegate.notifyButtonTapped()。在 B 类中,符合协议并实现 notifyButtonTapped() 方法。

  3. 通知:在 NotificationCenter 上从 A 类发布通知,并将该通知的 addObserver 添加到 B 类。查看this链接了解更多信息。

  4. 闭包/块:在这种情况下,闭包不是最佳解决方案,它们可能相当复杂,难以完全理解

你可以和代表团一起去这里。检查来自 rw 的 this link 以获得澄清。

【讨论】:

  • 感谢您对可能解决方案的概述。我一定会检查所有的方法!
  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。看看here
  • @Alessandro 你是对的。现在肯定会做。
【解决方案2】:

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

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

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 个场景“相互重叠”,或者当前场景是否会被最新调用的场景替换?
  • 回答第一个问题:当你呈现下一个场景时,当前场景会被自动释放,所以你不必移除当前场景。
  • 回答第二个问题:应该总是有 1 个场景,如果你能看到两个场景(在内存分配中,使用仪器),那么你在代码中犯了错误,比如保持对 self 的强引用你的场景
  • 这是从视图中访问控制器方法的安全方法吗?是否有任何内存泄漏或硬引用之类的?我是 swift 和 iOS 开发的新手...
【解决方案3】:

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

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

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

【讨论】:

  • 收到错误:Value of type 'SKScene' has no member 'reactionMethod'
猜你喜欢
  • 2018-09-11
  • 2015-04-30
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2012-04-09
  • 2011-02-27
  • 2013-06-25
相关资源
最近更新 更多