2017-06-14 90 views
-1

我很新的swift,我有一個帶有5個不同視圖控制器和5個不同視圖controller.swift文件的標籤頁應用程序。每個視圖控制器具有類似的語法,但一些名稱和標籤是不同。每個控制器都有一個功能,可以重新啓動我的數據值,並且每頁都可以工作。但我想要做的是通過按下一個視圖控制器中的一個按鈕來訪問每個視圖控制器的清晰功能。我的格式化/邏輯可能完全關閉。林教授自己,所以任何幫助表示讚賞Swift:從不同的視圖控制器調用函數

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() 
} 

我的代碼休息和應用程序崩潰,當我運行和訪問主清除功能

回答

0

你真正想要做的是製作一個你想要在不同視圖之間分享的數據模型。我會做一個樣本。創建一個快捷文件這樣的數據模型:

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() 
} 

現在重寫編寫功能將數據發送給我們要

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 
    } 
} 
+0

謝謝你的幫助!我試過這個,但我沒有運氣..第二個視圖控制器上沒有清除任何東西。我是否需要在主人清楚的情況下在課程中的任何位置創建實例? –

+0

我不好,你需要獲取應用程序啓動時創建的實例。試試我更新的答案 – Steve

+0

仍然沒有。我必須以某種方式將viewcontroller.swift文件鏈接在一起嗎?我有FirstViewController.swift和SecondViewController.swift。感謝您的幫助,我真的很感激! –

相關問題