使用Swift,如何从另一个视图控制器中的按钮调用在一个视图控制器中编码的函数?

时间:2016-02-05 10:08:21

标签: ios swift

我开始通过一些关于Swift编程语言的在线课程来学习编程。我正在试验一个Xcode项目,其中我的主要故事板中有两个视图控制器。

在项目中我有一个按钮,从视图控制器1到视图控制器2.视图控制器2有三个按钮:

  • 通过邮件应用程序触发新电子邮件
  • 关闭屏幕并将用户返回到第一个视图控制器屏幕
  • 并且第三个应该调用一个函数(其代码位于第一个视图控制器的ViewController.swift中)。

有问题的功能实际上非常简单:

func ResetGame()
{
    PlaySoundButton()
    score = 0
    totalquestionsasked = 0

}

我已经失去了我试图让它工作的所有方法的数量,但最初我认为它只是一个简单的按钮,在第二个视图中有以下代码片段之一:

@IBAction func buttonResetGame(sender: UIButton) {

    ResetGame()
}

或者

 @IBAction func buttonResetGame(sender: AnyObject) {

        ResetGame()
    }

但当然这导致使用未解析的标识符' ResetGame' 错误。

我还尝试直接在按钮代码中编写函数,如下例所示:

@IBAction func buttonResetGame(sender: UIButton) {

    PlaySoundButton()
    score = 0
    totalquestionsasked = 0

}

但当然,这也不起作用。

我已经对此进行了研究,看来这在Objective C和其他编程语言中是可行的,但我似乎无法使用Swift找到这样的例子。这是否意味着它不可能,或仅仅是因为它不是完成的事情?

总结:

  • 这可能吗?
  • 如果是这样,怎么样?
  • 如果不推荐,为什么不呢?
  • 最后,在视图控制器中使用函数的推荐方法是什么?

2 个答案:

答案 0 :(得分:1)

通常,可以但不推荐,因为视图控制器用于显示视图,而不是用于在不同的视图控制器之间共享功能。

您应该通过创建一个单独的类来实现这一点,这个类将从两个视图控制器中引用,您可以在其中定义此函数,该函数保存公共功能。

<强> EDITED : 如果您不想从2个视图控制器共享通用功能,但只需要从另一个控制器调用某些代码,则可以使用委派模式,如

class FirstController: UIViewController, YourProtocol {

     override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {

         if segue?.identifier == "yourSegueName" {
             let viewController = segue!.destinationViewController as! SecondController
             viewController.controller = self
         }
     }

     func someFunction() {

     }
}

class SecondController: UIViewController {

     var controller: YourProtocol?   // reference to the delegate alias First Controller

         override func viewDidLoad() {
              super.viewDidLoad()
              controller.someFunction()   // call function from the delegate alias first controller
    }

}

protocol YourProtocol {

     func someFunction()

}

答案 1 :(得分:0)

要调用ResetGame(),您需要第一个视图控制器的实例,然后您可以调用instance.ResetGame()。您可以使用

将第一个视图控制器的实例传递给第二个视图控制器
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            let secondViewController = segue.destinationViewController as! SecondViewController
            destinationVC.instance = self
        }