我开始通过一些关于Swift编程语言的在线课程来学习编程。我正在试验一个Xcode项目,其中我的主要故事板中有两个视图控制器。
在项目中我有一个按钮,从视图控制器1到视图控制器2.视图控制器2有三个按钮:
有问题的功能实际上非常简单:
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找到这样的例子。这是否意味着它不可能,或仅仅是因为它不是完成的事情?
总结:
答案 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
}