2017-06-14 2 views
-1

Ich bin sehr neu zu swift, ich habe eine Tabbed-App mit 5 verschiedenen View-Controllern und 5 verschiedenen view controller.swift-Dateien.Jeder View-Controller hat eine ähnliche Syntax, aber ein paar Namen und Labels anders. Jeder Controller hat eine Funktion, die meine Datenwerte neu startet und alle funktionieren pro Seite. Aber was ich versuche zu tun, ist den Clear-Funktionen von jedem View-Controller zugreifen, indem Sie nur eine Taste von einem View-Controller drücken. Meine Formatierung/Logik ist möglicherweise komplett ausgeschaltet. Im Unterricht selbst so dass jede Hilfe sehr geschätzt wirdSwift: Aufruf von Funktionen von verschiedenen View Controllern

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) 

} 

Dies ist die klare Funktion auf alle meine Ansicht-Controller

//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 
} 

Dies ist die Funktion, die ich in der Lage sein, alle klare Funktionen für den Zugriff auf I haben auf jedem Controller-

//Clear all Function 
func MasterClear(){ 

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

meinen Code Pausen und App stürzt ab, wenn ich laufen und Zugriff auf die Master-Löschfunktion

Antwort

0

Was Sie wirklich tun möchten, ist ein Modell der Daten, die Sie für die verschiedenen Ansichten einer für jede Ihrer Ansichten freigeben möchten. Ich werde eine Probe mit einem machen. schaffen, wie dies eine schnelle Datei für Ihr Datenmodell:

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 

    } 


} 

nächsten in Ihren ersten View-Controller eine Variable hinzufügen, die eine Instanz des Modells ist

class FirstViewController: UIViewController { 
    var modelController: TestModel! 

und in Ihrer viewDidLoad Funktion initialisieren die Variable

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

} 

erstellen Sie Ihre klare Funktion. Ich rief Mine zurück:

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

außer Kraft setzt nun die Funktion bereitet die Daten an den View-Controller senden wir

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

in ihrem zweiten View-Controller erstellen Sie eine Variable des Modells gehen aber in Diese Instanz wird nicht in der Funktion viewDidLoad initialisiert.

class SecondViewController: UIViewController { 

    var modelController: TestModel! 

wir initialisieren es nicht, da wir es vom ersten View-Controller in unserer Prepare-Funktion übergeben.

in der zweiten Ansicht Controller viewWillApear Funktion die Ansicht mit den Daten aus dem Modell, das Modell

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 
} 

ein letzten Schritt aktualisiert nicht vergessen die Vorbereitung Funktion zu implementieren, um die ersten View-Controller zurück in passieren Fall Sie haben es aktualisiert

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

Vielen Dank für die Hilfe! Ich habe das aber probiert und ich bekomme kein Glück .. Auf dem zweiten View-Controller ist nichts geklärt. Muss ich die Instanz irgendwo in der Klasse mit dem Master löschen? –

+0

meine schlechte müssen Sie die Instanz, die beim Start der App erstellt wird. Versuchen Sie meine aktualisierte Antwort – Steve

+0

Immer noch nichts .. Muss ich die viewcontroller.swift Dateien irgendwie miteinander verknüpfen? Ich habe FirstViewController.swift und SecondViewController.swift.Danke für all deine Hilfe, ich schätze es sehr! –

Verwandte Themen