所以,我对Swift中的类和函数有一个相当简单的问题。
让我们说我用SpriteKit制作应用程序。我有一个GameScene(SKScene),一个GameViewController(UIViewController)和一个GameViewController的主要故事板。
如果我想在GameScene上面放一个按钮,我可以将主故事板上的按钮IBOutlet连接到GameViewController。但是如何设置它,如果我触摸按钮我可以在GameScene中调用一个函数?
我是否必须通过委托来处理这个问题,还是有更简单的方法?
编辑:
详细说明,我要打电话的功能是:
func resetScene(){
self.removeAllActions()
self.removeAllChildren()
}
我试图声明为class func
,但不知何故它不起作用。
答案 0 :(得分:4)
基本上有四种方法可以从另一个类调用函数。
班级实例。如果您有一个say class Object 的实例,则可以在该实例上调用 Object的方法,如 myObject.buttonTapped()。
通过委托:为A类创建协议并在协议中声明该方法。 A类必须具有协议的实例。在 buttonTapped 方法中调用该方法,例如 delegate.notifyButtonTapped()。在B类中,遵守协议并实施 notifyButtonTapped()方法。
通知:通过A类的 NotificationCenter 发布通知,并在B类中为该通知发布addObserver。请查看this链接以获取更多信息。
你可以在这里与代表团一起去。从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
}