Swift: 从不同的视图控制器调用函数

Swift: Calling Functions from different View Controllers

我是 swift 的新手,我有一个带有 5 个不同视图控制器和 5 个不同视图的选项卡式页面应用程序 controller.swift files.Each 视图控制器具有相似的语法,但有一些名称和标签不同。每个控制器都有一个功能,可以重新启动我的数据值,它们都按页面工作。但我想做的是,只需按下一个视图控制器中的一个按钮,即可从每个视图控制器访问清晰的功能。我的 formatting/logic 可能完全关闭了。我自学,所以感谢任何帮助

import UIKit

class FirstViewController: UIViewController {

// North wing
var nTotal = 0
var total = 0
//Stepper Values
@IBOutlet weak var tStepper: UIStepper!
@IBOutlet weak var cStepper: UIStepper!
@IBOutlet weak var ssStepper: UIStepper!
@IBOutlet weak var sStepper: UIStepper!

//-Tables
@IBOutlet weak var Tables: UILabel!
@IBAction func TCounter(_ sender: UIStepper) {
    Tables.text = String(Int(sender.value))

}

//-Carrels
@IBOutlet weak var Carrels: UILabel!
@IBAction func CCounter(_ sender: UIStepper) {
    Carrels.text = String(Int(sender.value))
}

//-Soft Seating
@IBOutlet weak var SoftSeating: UILabel!
@IBAction func SSCounter(_ sender: UIStepper) {
    SoftSeating.text = String(Int(sender.value))
}

//-Standing
@IBOutlet weak var Standing: UILabel!
@IBAction func SCounter(_ sender: UIStepper) {
    Standing.text = String(Int(sender.value))
}

//-Clear Pop-up
@IBAction func Clear(_ sender: UIButton) {
    let alert = UIAlertController(title: "Clear", message: "Clear all or current page?", preferredStyle: .alert)

    let clearPage = UIAlertAction(title: "Clear Page", style: .default, handler: {ACTION in

        self.nClear()
    })
    let clearAll = UIAlertAction(title: "Clear All", style: .destructive, handler: {ACTION in

        self.MasterClear()
        })

    let Cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(clearPage)
    alert.addAction(clearAll)
    alert.addAction(Cancel)
    self.present(alert, animated: true, completion: nil)

}

这是我所有视图控制器上的清除功能

//Clear Function
func nClear() {
    self.Tables.text = "0"
    self.Carrels.text = "0"
    self.SoftSeating.text = "0"
    self.Standing.text = "0"

    //Stepper Clear
    self.tStepper.value = 0
    self.cStepper.value = 0
    self.ssStepper.value = 0
    self.sStepper.value = 0
}

这是我希望能够访问我在每个控制器上拥有的所有明确功能的功能

//Clear all Function
func MasterClear(){

    self.nClear()
    SecondViewController().iLClear()
}

当我 运行 并访问主清除功能时,我的代码中断并且应用程序崩溃

您真正想要做的是为您的每个视图创建一个要在不同视图之间共享的数据模型。我会用一个做一个样本。像这样为您的数据模型创建一个 swift 文件:

class TestModel {

  var Tables: String = "0"
  var Carrels: String = "0"
  var SoftSeating: String = "0"
  var Standing: String = "0"

  //Stepper Clear
  var tStepper: Int = 0
  var cStepper: Int = 0
  var ssStepper: Int = 0

  func modelReset() {
    Tables = "0"
    Carrels = "0"
    SoftSeating = "0"
    Standing = "0"
    tStepper = 0
    cStepper = 0
    ssStepper = 0

  }


}

接下来在您的第一个视图控制器中添加一个作为模型实例的变量

class FirstViewController: UIViewController {
    var modelController: TestModel!

并在您的 viewDidLoad 函数中初始化变量

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    modelController = TestModel()

}

创建您的清除函数。我打电话给我重置:

 @IBAction func reset(_ sender: Any) {
    //Do for each ViewConrtoller
    modelController.modelReset()
}

现在覆盖 prepare 函数以将数据发送到我们要去的视图控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondViewController = segue.destination as? SecondViewController {
        secondViewController.modelController = modelController
    }
}

现在在你的第二个视图控制器中创建一个模型变量,但在这种情况下我们不会在 viewDidLoad 函数中初始化它。

class SecondViewController: UIViewController {

  var modelController: TestModel!

我们没有初始化它,因为我们在准备函数中从第一个视图控制器传递它。

在第二个视图控制器中,viewWillApear 函数使用模型中的数据更新视图

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.Tables.text = modelController.Tables
    self.Carrels.text = modelController.Carrels
    self.SoftSeating.text = modelController.SoftSeating
    self.Standing.text = modelController.Standing

    //Stepper Clear
    self.tStepper.value = modelController.tStepper
    self.cStepper.value = modelController.cStepper
    self.ssStepper.value = modelConroller.ssStepper
}

最后一步不要忘记实现准备功能以将模型传回第一个视图控制器,以防您更新它

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let secondViewController = segue.destination as? SecondViewController {
        secondViewController.modelController = modelController
    }
}