2016-05-10 6 views
2

Ich möchte ein Formular validieren, das sich in einem Container in einem übergeordneten Ansichtscontroller befindet. Wie kann ich das Formular validieren (überprüfen Sie, ob alle Felder nicht nil sind), wenn auf eine Schaltfläche im übergeordneten Ansichts-Controller geklickt wird. Die Schaltfläche hat eine IBOutlet in der übergeordneten Ansicht Controller, der eine Methode aus der Klasse des Formulars aufruft.swift - Überprüfen Sie, ob uitextfield in einer anderen Klasse leer ist

@IBAction func submitOrder(sender: AnyObject) { 
     let formView = FormViewController() 
     formView.getFieldValues() 
    } 

Das Verfahren ist

func getFieldValues() { 
     if (self.nameField.text == "") { 
      print("Name field is empty") 
     } 
    } 

The nameField in der untergeordneten Ansicht hat die IBOutlet wird

@IBOutlet weak var nameField: UITextField! 

Wenn die Taste in der übergeordneten Ansicht Controller klickte ich die klassischen Fehler angezeigt ,

fatal error: unexpectedly found nil while unwrapping an Optional value

Das hat also etwas mit Optionalen zu tun, oder der Eltern-View-Controller erkennt die Textfelder in der Container-Ansicht nicht.

Antwort

0

Lou ist korrekt über die Wurzel des Problems, das die neue, nicht verbundene Instanz von ist. Damit der übergeordnete Ansichtscontroller die uiTextFields der Containeransicht erkennt, müssen Sie prepareForSegue verwenden. Nachdem Sie im Storyboard den Pfad containerView benannt haben, müssen Sie diese Methode implementieren.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "formView" { 
     formView = segue.destinationViewController as? FormViewController 
    } 
} 

formView ist die leere Instanz FormViewController innerhalb der Klasse erklärt. Diese Verbindung ermöglicht es der übergeordneten Ansichtsklasse, die Werte der UITextFields in

0

Eine Möglichkeit besteht darin, dass Sie die Textfelddaten (wie auch immer der Benutzer eingegeben hat) temporär (wie in Benutzervorgaben) mit den delegate-Methoden von textfield speichern können.

Wenn die Schaltfläche geklickt wird, müssen Sie nur überprüfen, dass die gespeicherten Daten und wenn nichts getippt ist, dann gibt es keine oder leere Zeichenfolge, was auch immer es ist, können Sie identifizieren und Textfeld validieren.

2

Wenn Sie schreibt:

let formView = FormViewController() 
    formView.getFieldValues() 

Sie eine brandneue FormViewController erstellt, die nicht von einem Storyboard und daher Stellen nicht angeschlossen geladen haben. Aber selbst wenn sie an etwas angeschlossen wären, wären es neue Textfelder, nicht die auf dem Bildschirm.

Sie sollten keine neue erstellen - Sie sollen auf die, die Sie zeigen, zugreifen.

Ohne weiteren Code können wir nicht helfen, aber wo auch immer im übergeordneten Element die Formularansicht erstellt wurde, die angezeigt wird, behalten Sie einen Verweis darauf, damit Sie später darauf zugreifen können.

+0

zu erhalten Die untergeordnete Ansicht in der Containeransicht ist eine Unterklasse von UITableView, da es statische Zellen hat. Wie kann ich eine Instanz von FormViewController erstellen, die eine Verbindung mit der Containeransicht herstellt, die eine UIView ist? – tc333

+0

Ziemlich sicher, dass Sie es in den ChildViewControllern der Eltern finden können - wahrscheinlich hat nur ein Objekt - Sie können sehen, ob es in ist. –