繁体   English   中英

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

[英]Using Swift, how do I call a function coded in one view controller from a button in another view controller?

我已经开始通过在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的示例。 这是否意味着这是不可能的,或者仅仅是这不是完成的事情?

综上所述:

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

通常,可能(但不建议)是因为视图控制器在那里用于显示视图,而不是用于在不同视图控制器之间共享功能。

您应该通过创建要从两个View Controllers引用的单独类来实现此目的,在该类中您将定义此函数,该函数具有通用功能。

编辑 :如果您不想共享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()

}

要调用ResetGame(),您需要第一个视图控制器的实例,然后可以调用instance.ResetGame() 您可以使用以下方式将第一个视图控制器的实例传递给第二个视图控制器

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            let secondViewController = segue.destinationViewController as! SecondViewController
            destinationVC.instance = self
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM