Anfängerfrage: Aktualisierung von views

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

  • Anfängerfrage: Aktualisierung von views

    Hallo zusammen,

    ich versuche mich gerade mit SwiftUI anzufreunden und stehe gerade vor einem grundsätzlichen Verständnisproblem. Ich möchte ein View permanent (1 x pro Sekunde) aktualisieren. Per Button funktioniert es.

    Mein Beispiel:
    Ich habe eine Funktion, die die aktuelle Uhrzeit als String zurück liefert.
    in ContentView wird dann auch beim Aufruf die Uhrzeit ausgegeben. Jetzt möchte ich aber in diesem Beispiel, dass der View sich regelmäßigssig aktualisiert und immer die aktuelle Uhrzeit ausgegeben wird. Eine Endlosschleife wollte ich aber nicht vewenden...
    An welcher Stelle sehe ich den Wald vor lauter Bäumen nicht? :)

    import SwiftUI

    struct ContentView: View {
    var body: some View {
    Text(ShowTime())
    }
    }

    struct ContentView_Previews:PreviewProvider {
    static var previews:some View{
    ContentView()
    }
    }

    func ShowTime() ->String
    {...}
  • Hey,

    ich habe bis jetzt noch nicht mit SwiftUI gearbeitet, sei angemerkt. Aber spontan hätte ich gesagt, dass du einen Logik-Fehler hast: Du willst die Uhrzeit sekündlich updaten - ja dann tu es doch! Du callst ShowTime() (Funktionsnamen sollten kleingeschrieben sein) aber nur ein einziges Mal. Außerdem, ist bei SwiftUI nicht der Gedanke, dass du nicht die View updatest, sondern das Model? Probier doch mal:

    • Irgendwo hast du eine Funktion, die du einmalig callst, wenn die View gezeigt wird, sagen wir startTimer()
    • Zusätzlich hast du eine Klassen-Variable, sagen wir currentTime
    • In startTimer() initialisierst du einen Timer, der sekündlich triggert. Im handler, der sekündlich aufgerufen wird, updates du currentTime
    • In deiner View nimmst du einfach Text(currentTime) (oder so).
    • currentTime musst du irgendwie als Binding (oder State?) deklarieren. Dann wird soweit ich weiß die View, sobald sich der Wert verändert, automatisch upgedatet.


    LG
  • Absolute_Beginner schrieb:

    vielleicht habe ich "In startTimer() initialisierst du einen Timer, der sekündlich triggert. Im handler, der sekündlich aufgerufen wird, updates du currentTime" noch nicht ganz verstanden. Magst Du mit etwas mehr Worten ausführen was Du meinst? Anfänger-kompatibel meine ich :)
    Schau Dir einmal die Dokumentation zu NSTimer an, dann sollten sich die obigen Hinweise klären: Mit dieser Klasse kannst Du eine Methode zeitgesteuert ausführen lassen ... wobei zu beachten ist, dass das angegebene Intervall nicht 100% garantiert ist.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo MyMattes,

    Dein Tipp hat mir schon mal weitergeholfen. Unter Swift5.1 heisst die Funktion wohl Timer().

    Wenn ich die ContentView so aufbaue, wird das Datum ausgegeben und aktualisiert.

    import SwiftUI

    struct ContentView: View {
    @State var now = Date()

    let timer = Timer.publish(every: 1, on: .current, in: .common).autoconnect()

    var body: some View {
    Text("\(self.now)")
    .onReceive(timer) {_ in
    self.now = Date()}
    }
    }

    Wenn ich aber die Zeile Text ändere in Text (show_time()) dann wird meine Zeit nicht aktualisiert.

    Wo liegt mein Denkfehler?
  • Hallo MyMattes,

    auch wenn Du Dich nicht mit Swift auskennst, hat Dein Tipp mir ja schon mal geholfen :) Den Code-Tag habe ich nicht gesehen, werde ich aber beim nächsten Mal verwenden.
    Vielleicht hat jemand anders noch den richtigen Hinweis für mich.

    die Funktion set_time() ist nur eine Beispielfunktion, die die Uhrzeit als String zurück liefert.
    Wenn ich ContentView wie o.a. aufrufe, wir immer das aktuelle Datum ausgegeben. Rufe ich in Text aber meine Funktion auf, wird die Ausgabe nicht einmal je Sekunde aktualisiert sondern bleibt immer gleich.
    Mir ist nicht ganz klar wo mein Denkfehler liegt.
    Eigentlich müsste einmal pro Sekunde in Text meine Funktion aufgerufen werden und da sich die Uhrzeit ändert, auch entsprechend ausgegeben werden....