2016-06-21 14 views
0

Ich versuche, einen Zeichenfolgenwert mit einem Delegaten an den vorherigen Ansichtscontroller zurückzugeben. Alles scheint korrekt zu funktionieren, außer dass der zurückgegebene Zeichenfolgenwert aus irgendeinem Grund nicht im UITextField im ersten View Controller angezeigt wird, wo ich es haben möchte.Problem beim Zurückgeben einer Zeichenfolge an vorherigen Ansichtscontroller in Swift

Hier ist mein entsprechender Code:

Viewcontroller "B" (die die Daten zurück zum vorherigen View-Controller vorbei):

protocol CountryFieldProtocol { 
     func setField(countryName: String) 
    } 

    class TableViewController: UITableViewController { 

     var countryProtocol: CountryFieldProtocol? 
    ... 

    func dismiss() { 

     for item in countries { 
      if item.isSelected == true { 
       print("what is the country selected?" + item.name) 
       countryProtocol?.setField(item.name) 
      } 
     } 

     self.navigationController?.popViewControllerAnimated(true) 
    } 

Hier ist der Code in Viewcontroller "A" (das man die Daten von View Controller "B") empfangen:

func setField(countryName: String) { 

     textField.text = countryName 
     print("the country selected is:" + textField.text!) 
    } 


    @IBAction func textFieldEditing(sender: AnyObject) { 

     textField.resignFirstResponder() 
     let tableViewController = self.storyboard?.instantiateViewControllerWithIdentifier("CountryList") as? TableViewController 
     tableViewController?.countryProtocol = self 
     self.navigationController?.pushViewController(tableViewController!, animated: true) 

    } 

In meinem obigen Code, der zweite View Controller aufgerufen wird, wenn der Benutzer das Textfeld auswählt. Der Benutzer wird dann zu einer UITableView geleitet, wo der Benutzer ein Element aus der Liste auswählen kann. Nachdem die Auswahl getroffen wurde, klickt der Benutzer in der Navigationsleiste auf die Schaltfläche "Fertig" und sollte zum ersten View-Controller zurückgebracht werden.

Theoretisch sollte die Benutzerauswahl aus der Liste im Textfeld des ersten View Controllers erscheinen. Während die Auswahl von der setField-Funktion im ersten View-Controller auf der Konsole ausgegeben wird, wird die Zeichenfolge leider nicht im textField angezeigt. Kann jemand sehen, was ich falsch mache?

+0

Ihr Ansatz ist nicht gut, wenn Sie ein Formular erstellen, empfehle ich mit Eureka: https://github.com/xmartlabs/Eureka –

+1

Können Sie zeigen, wo Sie 'countryProtocol' auf Ansicht Controller b setzen – Paulw11

+1

Sie löschen die Textfeld Wert in viewWillAppear oder viewDidAppear? Beide Funktionen werden nach setField aufgerufen. Wenn ich das Projekt nur mit dem von Ihnen geposteten Code erstelle, funktioniert alles. –

Antwort

0

Countryprotocol wird als optional deklariert und nie instanziiert, daher wird setField() nie aufgerufen, weil countryProtocol gleich null ist.

Sie sollten diese Var "füllen", und der beste Ort, um es zu tun ist der erste Viewcontroller-Übergang.

+0

setField() wird aufgerufen, da der Wert der Zeichenfolge über die print-Anweisung gedruckt wird. – syedfa

+0

Der Druck wird als Element aufgerufen.isSelected == true, während setField aufgerufen wird, wenn countryProtocol nicht null ist – sabi

+0

Ich erhalte Ausgabe von beiden print-Anweisungen. Ich habe die Ausgabe, um es zu beweisen, da die Drucknachrichten verschieden sind. – syedfa

0

Ich möchte allen danken, die entweder eine Lösung kommentiert oder eingereicht haben. Ich habe das Problem erkannt, und eine Person war tatsächlich auf dem richtigen Weg, als er sagte, dass er meine Arbeit nachgebildet habe und sie wie geplant funktionierte.

Ich konnte dieses Problem lösen, indem ich das textField, das ich vom Storyboard erstellt hatte, löschte, ein anderes stattdessen hinzufügte und es dann an die entsprechenden Ausgänge umverdrahtete. Danach lief alles reibungslos. Ich habe keine logische Erklärung, warum das funktioniert hat, aber es hat trotzdem getan.

Nochmals vielen Dank an alle, die versucht haben, eine Lösung für mich zu finden.

Alles Gute.

Verwandte Themen