Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:从不同的视图控制器调用函数_Ios_Swift_Xcode_Function_Dynamic Linking - Fatal编程技术网

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

Ios Swift:从不同的视图控制器调用函数,ios,swift,xcode,function,dynamic-linking,Ios,Swift,Xcode,Function,Dynamic Linking,我是swift的新手,我有一个选项卡式页面应用程序,有5个不同的视图控制器和5个不同的view controller.swift文件。每个视图控制器都有相似的语法,但一些名称和标签是不同的。每个控制器都有一个函数,可以重新启动我的数据值,它们都可以每页工作。但我想做的是,只需从一个视图控制器中按下一个按钮,即可从每个视图控制器访问clear功能。我的格式/逻辑可能完全关闭。我在自学,所以任何帮助都是感激的 import UIKit class FirstViewController: UIVi

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

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!
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
}
在viewDidLoad函数中初始化变量

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

}
创建你的clear函数。我叫我的重置:

 @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!
当我们从prepare函数中的第一个视图控制器传递它时,我们不会初始化它

class SecondViewController: UIViewController {

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

class FirstViewController: UIViewController {
    var modelController: TestModel!
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
}
最后一步,不要忘记实现prepare函数,以便在更新模型后将其传递回第一个视图控制器

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

谢谢你的帮助!但是我试过了,但没有成功。。在第二个视图控制器上未清除任何内容。我是否需要使用master clear在类中的任何特定位置创建实例?我的坏消息是,您需要获取在应用程序启动时创建的实例。试试我的最新答案还是没什么。。我是否必须以某种方式将viewcontroller.swift文件链接在一起?我有FirstViewController.swift和SecondViewController.swift。谢谢你的帮助,我真的很感激!对不起,我刚刚有时间再谈这个。我更新了一个更好的解决方案。我只做了一个有两种观点的例子,但我认为你可以从中得到想法