Probleme bei IOS Programmierung

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

  • Probleme bei IOS Programmierung

    Hallo Community,

    bin neu hier und habe direkt mal eine Frage an euch.

    Folgendes Problem:

    Ich möchte gerne das ein Label auf dem (von mir so genannten) SecondViewController den Text übernimmt, welchen man auf dem (ebenfalls von mir so genannten) View Controller in einem TextField eingegeben hat. Habe soweit alles fertig geschrieben, beim starten der App wird auch keine Fehlermeldung gezeigt, scheint also alles zu funktionieren. Das Problem ist jedoch, dass der Text nicht übernommen wird, das Label ist einfach leer. Die Verbindungen über die segue's sind alle gesetzt, und wie gesagt es wird keine Fehlermeldung angezeigt.

    Wenn ihr irgendwelche Protokolle der .swift Dateien braucht schreibt einfach!

    Danke schonmal im voraus,

    Tom :D
  • Hi Tom!

    Zunächst mal willkommen hier!

    Ohne dass Du uns irgendeinen Code zeigst, ist jede Hilfestellung wie Kaffeesatzlesen, aber ich versuche es einmal:

    Du musst den String von einem ViewController an den anderen übergeben, sonst kann der zweite nicht wissen, was im ersten gesetzt wurde. Ein übliches Verfahren hierzu ist, ein Property des aufgerufenen ViewControllers in der "prepareForSegue:"-Methode des aufrufenden zu setzen.

    Mit diesen Stichworten solltest Du eigentlich weiterkommen :)

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Dankeschön schonmal :D
    hier einmal der code vom Viewcontroller:

    //
    // ViewController.swift
    // Toms App
    //
    // Created by Tom Schaefer on 25.09.17.
    // Copyright © 2017 Tom Schaefer. All rights reserved.
    //

    import UIKit

    class ViewController: UIViewController {
    @IBOutlet var eingabeTextField: UITextField!

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "sendenButtonSegue" {
    let nextVC:SecondViewController = segue.destination as! SecondViewController
    nextVC.segueVar = self.eingabeTextField.text!
    }
    }
    }


    und vom SecondViewController:

    //
    // SecondViewController.swift
    // Toms App
    //
    // Created by Tom Schaefer on 25.09.17.
    // Copyright © 2017 Tom Schaefer. All rights reserved.
    //

    import UIKit

    class SecondViewController: UIViewController {

    @IBOutlet var meinLabel: UILabel!
    var segueVar:String = ""
    override func viewDidLoad() {
    super.viewDidLoad()

    self.meinLabel.text = segueVar
    }
    }
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
    }
    */

    :D
  • Könntest Du das nächste Mal Code-Tags verwenden ... es erleichtert das Lesen erheblich.

    Ich bin in der Swift-Syntax nicht sicher, so dass ich keine "kleinen" Fehler erkennen kann, aber ist die "viewDidLoad"-Methode die richtige Stelle, den Label-Text zu setzen? Ich vermute, segueValue ist zu diesem Zeitpunkt noch nicht gesetzt. Check das mal mit dem Debugger...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hat mit Swift nix zu tun: mach Dir gegenwärtig, zu welchem Zeitpunkt die genannten Methoden ausgeführt werden ... Du weist einer Variablen eine andere zu, die (höchstwahrscheinlich). noch gar nicht gesetzt ist. Hier geht es um den Lebenszyklus von Views bzw. ViewControllern - ich glaube, es gibt ein Kapitel in Apple‘s Programming Guide, das so ähnlich heißt.

    Mattes

    Edit: Hier ist es... :D
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Ich konnte es jetzt mal testen und bei mir funktioniert es auch. Daher wird das wohl nicht das Problem sein. Da bliebe eigentlich nur noch dass der Code im if Teil von prepareForSegue nicht ausgeführt wird.

    @Tom16092 setze doch in der Zeile

    Quellcode

    1. if segue.identifier == "sendenButtonSegue" {
    einen Breakpoint und schau nach ob der Rest ausgeführt wird.
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • matz schrieb:

    viewDidLoad funktioniert auch, segue.destination sort dafür das alles von der view geladen ist. Ich würde mal prüfen (Breakpoint) ob dein segue den richtigen Identifier hat.
    Gerade dies halte ich aber für einen Widerspruch: Wenn segue.destination schon ein vollständiges Laden von nextVC zur Folge hätte, würde dessen viewDidLoad-Methode vor Setzen des Property segueVar durchgeführt und das Label bliebe leer.

    Dass obiges Konstrukt funktioniert, liegt m. E. eher an dem lazy loading von Views:

    Apple schrieb:

    Typically, iOS calls viewDidLoad() only once, when its content view is first created; however, the content view is not necessarily created when the controller is first instantiated. Instead, it is lazily created the first time the system or any code accesses the controller’s view property.
    Daher wird hier viewDidLoad erst verzögert aufgerufen und zu diesem Zeitpunkt ist das Setzen von segueVar in der prepareForSegue-Methode schon erfolgt. Kann man in Deinem angehangenen Beispielcode (mit einigen Logausgaben ergänzt) auch gut erkennen: viewDidLoad wird aufgerufen, nachdem prepareForSegue schon beendet wurde:

    Quellcode

    1. 2017-10-03 10:26:38.679497+0200 ShareValue[36049:1507661] prepareForSegue
    2. 2017-10-03 10:26:38.691140+0200 ShareValue[36049:1507661] Before setting second.theValue = Test
    3. 2017-10-03 10:26:38.691353+0200 ShareValue[36049:1507661] After setting second.theValue = Test
    4. 2017-10-03 10:26:38.695693+0200 ShareValue[36049:1507661] value = Test

    Das Ganze funktioniert nicht mehr, wenn Apple das Verhalten des lazy loadings einmal ändert oder z. B. zwischen beiden VCs hin und her gewechselt wird, ohne dass nextVC freigegeben und neu allokiert wird. Ich würde daher variable Inhalte meiner View immer im viewWillAppear setzen und viewDidLoad nur für Initialisierungen nutzen...

    Mattes
    Dateien
    • ShareValue.zip

      (40,83 kB, 264 mal heruntergeladen, zuletzt: )
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von MyMattes () aus folgendem Grund: Typos und lazy loading von Views (nicht -Controllern)

  • Tom16092 schrieb:

    Hallo Community,

    bin neu hier und habe direkt mal eine Frage an euch.

    Folgendes Problem:

    Ich möchte gerne das ein Label auf dem (von mir so genannten) SecondViewController den Text übernimmt, welchen man auf dem (ebenfalls von mir so genannten) View Controller in einem TextField eingegeben hat. Habe soweit alles fertig geschrieben, beim starten der App wird auch keine Fehlermeldung gezeigt, scheint also alles zu funktionieren. Das Problem ist jedoch, dass der Text nicht übernommen wird, das Label ist einfach leer. Die Verbindungen über die segue's sind alle gesetzt, und wie gesagt es wird keine Fehlermeldung angezeigt.

    Wenn ihr irgendwelche Protokolle der .swift Dateien braucht schreibt einfach!

    Danke schonmal im voraus,

    Tom :D
    Du kannst dir in Xcode ein neues iOS-Projekt nach template "Master-Detail App" anlegen. Dort kannst du dir solche Basics auch abgucken. Da werden über den Add-Button neue Objekte erstellt und an den DetailViewController weitergegeben.