2017-04-17 2 views
0

Grundsätzlich wollte ich den Wert des Textfelds eines UIViewController und dann verwenden Sie es, um eine If-else-Anweisung zu tun.Wie erhalte ich den Textfeldwert eines UIAlertControllers und verwende ihn in anderen Funktionen? (Swift 3)

Ich werde durch ein Wörterbuch durchlaufen und wenn der Wert (des Wörterbuchs) größer als und/oder gleich der Benutzereingabe ist, werde ich die Schlüssel durch eine Tabellenansicht anzeigen.

Ich habe eine Alarmbox, die beim Laden der App angezeigt wird. Ich habe eine Funktion erstellt und sie dann unter viewDidLoad() aufgerufen.

func alertBox(){ 

    // create String objects for the title and the message 
    let title = "Enter your GPA" 
    let message = "With your help, we can list courses you are most likely eligible for based on the GPA you provide to us." 

    // create a UIAlertController object 
    let alert = UIAlertController(title: title, 
            message: message, 
            preferredStyle: UIAlertControllerStyle.alert) 


    // create a UIAlertAction object 

    //2. Add the text field. You can configure it however you need. 
    alert.addTextField { (textField) in 
     textField.text = "" 
    } 

    // 3. Grab the value from the text field, and print it when the user clicks OK. 
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in 
     let textField = alert?.textFields![0] // Force unwrapping because we know it exists. 
     if let textAlert = textField?.text { 
      print("Text field: \(textAlert)") 
      let item = Double(textAlert) 
      print(item!) 
      let unwrappedvalue = item! 
      self.dc.setUserInput(userI: unwrappedvalue) 
      print(self.dc.getUserInput()) 


     } 
    })) 


    // add the UIAlertAction object to the UIAlertController object 
    let cancelAction = UIAlertAction(title: "Cancel", 
            style: .cancel, 
            handler: nil) 
    alert.addAction(cancelAction) 

    // display the UIAlertController object 
    present(alert, animated: true, completion: nil) 
} 

Und mein viewDidLoad hier() Funktion: kann

override func viewDidLoad() { 
    super.viewDidLoad() 
    alertBox()  
} 

Wie Sie habe ich in einem Datacontroller Klasse eine get/set-Methode tatsächlich sehen, kann dies hier zu sehen. Auf diese Weise kann ich den Wert festlegen und dann den Wert in einer späteren Methode abrufen. Ich habe es benutzt, aber es scheint meine Werte nicht zu retten. Ich habe auch versucht, eine globale Variable zu erstellen und später den Wert des Textfelds in dieser Variable zu speichern.

dh

var textOfTF : Double = 0.0 

Und später dann in der Alertbox() Funktion:

  if let textAlert = textField?.text { 
      print("Text field: \(textAlert)") 
      let item = Double(textAlert) 
      print(item!) 
      self.textOfTF = item! 
      /* 
      self.dc.setUserInput(userI: unwrappedvalue) 
      print(self.dc.getUserInput()) 
      */ 

     } 

Hier sind meine get/set-Funktionen in meinem Datacontroller Klasse:

var userInput : Double = 0.0 
func getUserInput() -> Double{ 
    return userInput 
} 
func setUserInput(userI: Double){ 
    userInput = userI 
    return 
} 

Es verwaltet zu speichern, wenn ich die alert.addAction Methode (was ist das) :

alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in 
    let textField = alert?.textFields![0] // Force unwrapping because we know it exists. 
    if let textAlert = textField?.text { 
     print("Text field: \(textAlert)") 
     let item = Double(textAlert) 
     print(item!) 
     let unwrappedvalue = item! 
     self.dc.setUserInput(userI: unwrappedvalue) 
     print(self.dc.getUserInput()) 


    } 
})) 

Aber dann außerhalb dieses Verfahren Druck nur einen 0.0 Wert für mich gedruckt.

Ist in meinem Code etwas falsch? Bitte beraten.

P.S. dc in self.dc.setUserInput (..) ist eine Variable, in der ich die DataController-Klasse deklariert habe.

In der Tableviewcontroller Klasse:

var dc = DataController.sharedInstance 

In der Datacontroller Klasse:

static var sharedInstance = DataController() 

Antwort

0

Sie können einen statischen globalen Wert für Benutzer GPA Wert wie folgt leicht definieren:

struct defaultsKeys { 
     static var userGPA:Double = 0.0 
    } 

Danach können Sie diesen Wert aus Ihrem textField-Wert in Ihrem Benachrichtigungsfeld setzen:

alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in 
    let textField = alert?.textFields![0] // Force unwrapping because we know it exists. 
    if let textAlert = textField?.text { 
     print("Text field: \(textAlert)") 
     defaultsKeys.userGPA = Double(textAlert)! 
    } 

Und Sie können mit dem Aufruf dieser userGPA Wert in jedem View-Controller verwenden:

defaultsKeys.userGPA 
+0

getestet, und es gab mir das gleiche Ergebnis, immer noch nicht geschafft, zu speichern. –

+0

Vielen Dank für Ihre Hilfe obwohl –

+0

Vielleicht können Sie eine allgemeine Ansicht der Verwendung von statischen globalen Variablen in diesem Beispiel aussehen: http://Stackoverflow.com/a/43466290/3401842 – kkakkurt

0

Ich habe es geschafft, es zu lösen. Ja, ich habe es im DataController gespeichert, aber ohne Singleton-Methode.Verwenden Sie daher die Singleton-Methode zum Speichern und Abrufen von Daten.

dh

static var sharedInstance = DataController { 
     private init() 
} 

Shop in einer Variablen:

var value : Double = 0.0 

Und in Tableviewcontroller, rufen:

Datacontroller.sharedInstance.value 

Dank für das kkakkurt mir zu helfen, aber es war wirklich einfach . Ich weiß nicht, wie ich es übersehen habe.

Verwandte Themen