Ios Swift:从不同的视图控制器调用函数
我是swift的新手,我有一个选项卡式页面应用程序,有5个不同的视图控制器和5个不同的view controller.swift文件。每个视图控制器都有相似的语法,但一些名称和标签是不同的。每个控制器都有一个函数,可以重新启动我的数据值,它们都可以每页工作。但我想做的是,只需从一个视图控制器中按下一个按钮,即可从每个视图控制器访问clear功能。我的格式/逻辑可能完全关闭。我在自学,所以任何帮助都是感激的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
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。谢谢你的帮助,我真的很感激!对不起,我刚刚有时间再谈这个。我更新了一个更好的解决方案。我只做了一个有两种观点的例子,但我认为你可以从中得到想法