Daten vom ViewController zurück erhalten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Daten vom ViewController zurück erhalten

    Hi,

    ich habe einen ViewController mit einem Button über den ich einen zweiten ViewController aufrufe, um Logindaten zu erfassen.
    Das aufrufen ist kein Problem, aber ich weiß nicht, wie ich die geänderten Daten zurückerhalte, damit ich diese verwenden kann.

    Die Daten an den zweiten ViewController übergebe ich mit PrepareForSegue (auf dem StoryBoard verbunden):

    Quellcode

    1. override func prepareForSegue(segue: UIStoryboardSegue, Sender: AnyObject?) {
    2. if segue.identifier == "segueLogin" {
    3. let ctrl = segue.destinationViewController as ! LoginViewController
    4. ctrl.Login = self.login
    5. }
    6. }

    die var login ist eine Klasse, in der z.B. Host, Port, Username und Passwort gespeichert sind.

    in meinem Zweiten ViewController setzte ich jetzt unter viewDidLoad die Daten aus der Klasse login in die entsprechenden Eingabefelder, und kann diese auch dort bearbeiten.

    Aber wie geht's jetzt weiter?
    Im zweiten ViewController habe ich 2 Button, einen für Speichern und einen für Abbrechen. Aber ich muss ja irgendwie im ersten ViewController diese Ereignisse abfangen und entweder die Daten speichern oder halt nicht. Mir fehlt jetzt der Anschluss, wie und wo ich das machen könnte.
    Ich habe mir jetzt zwar schon etliche Bespiele aus dem Internet angeschaut, aber es werden immer TableViewController als Beispiel verwendet. Ich raff das irgendwie nicht, wie das mit einfachen ViewControllern geht.

    Danke für eure Hilfe.

    Gruß Dieter
  • Das habe ich auch schon aufgeschnappt, nur weiß ich nicht, wie das im Detail abläuft, bzw. wie ich das in meinen Code sauber implentiere.
    Der Link zeigt ja auf ein Beispiel in Objective-C. Als Anfänger habe ich schon mit Swift zu kämpfen. Eine Übersetzung in Swift wird mich nicht gelingen.
    Ich wird mich mal auf die Suche nach Beispielen zu Delegates machen. Es fällt mir schwer das Konzept hinter den Delegates zu verstehen. Mir fehlt der Vergleich zu meine Ursprünglichen Programmiersprache (Delphi). Und ich habe auch noch keinen Text gefunden, wo das so erklärt wurde, dass ich es wirklich verstanden hätte.
  • weiß nicht ob ein Delegate da der beste Weg ist

    im zweiten ViewController, kannst du die Daten per speichern auch in deine Datenhaltungsschicht schieben (CoreData oder was auch immer)
    dein erster ViewController macht ein fetch und bekommt mit ob Änderungen da sind

    da gibts halt mehrere Ansätze,
    Delegate, CoreData, Notifications, UI ändern (ist der 2te VC überhaupt nötig oder kann man das auch im 1ten mit machen)
    etc etc.

    aber wenn dir die Grundlagen fehlen, solltest du dir die erstmal aneignen
    hierbei ist es aber auch egal ob ObjectiveC oder swift
    die Bücher von Clemens sind da zu empfehlen
    openbook.rheinwerk-verlag.de/a…ren_fuer_iphone_und_ipad/

    wenn du das Prinzip verstanden hast, dann kannst du es auch in Swift umsetzen
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Entschuldigung. Das ist das gleiche, wie ich es schon so oft gelesen habe. Nur versteh ich das nicht. Das liegt sicherlich an mir, weil ich in der Entwicklung in dem Denken auf Grund meiner alten Sprache sicherlich so festgefahren bin, dass ich der Groschen einfach nicht fallen will.
    Wenn ich das richtig verstehe, dann muss ich erst ein Protokoll dazu definieren? Je mehr Beispiele und Tutorials ich mir anschaue, um so verwirrender wird das ganze, weil irgendwie jeder irgendwas anderes macht. Und weil mir ein konkretes Beispiel fehlt, wie ich das nun machen könnte, drehe ich mich im Kreis.
  • Das zugrunde liegende Konzept ist eigentlich völlig simpel. Da Du die beiden ViewController nicht aneinander koppeln solltest (was durch Apples prepareForSeque antipattern leider der Fall ist, aber das ist eine andere Geschichte), machst Du es über eine definierte Schnittstelle. Diese kann z.B. ein Delegate-Protokoll sein, es ginge aber auch mit einem completionBlock im zweiten VC, den Du in prepareForSeque des 1.VC setzt und dann an entsprechender Stelle im 2.VC aufrufst. Ich persönlich ziehe aber die Delegate-Variante vor.

    Genanntes Protokoll implementiert dann z.B. Dein erster VC und der zweite hat eine property delegate vom Typ dieses Protokolls und ruft da dann zu gegebener Zeit die entspr. Methode auf, wie die heisst hängt von Deinem Anwendungsfall ab.
  • Da würde ich der zweiten View einfach das Object übergeben,
    bei anzeigen der View Daten aus Object in die Eingabefelder eintragen,
    beim Speichern Daten aus Eingabefelder wieder in Object schreiben und View schließen
    und beim Abbrechen eben nur die View schließen.

    Und genauso habe ich es jetzt auch gemacht, und es funktioniert ;)
    Durch diese ganzen Beispiele, die ich durchgelesen habe, habe ich mich irgendwie so verwirren lassen, dass ich gar nicht auf die Idee gekommen bin, es einfach mal so zu machen, wie ich es gewohnt bin. Ist sicherlich nicht der eleganteste Weg. Vielleicht komme ich ja noch hinter dieses ganze Delegate-Geraffel.