SwiftUI Login View

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

  • SwiftUI Login View

    Hallo,

    Ich würde gerne in meine SwiftUI App beim Wechsel der Tabview eine Login View anzeigen, in der man ein Passwort eingeben muss um an weitere Daten zu kommen. Ich scheitere im moment noch daran, wie ich das genau machen soll. Mit einer NavigationView, die dann auf eine andere View zeigt habe ich immer eine Navigation zurück, das soll nicht sein. Außerdem bekomme ich es nicht hin, die Navigationview bei falschem Passwort zu deaktivieren.

    Bei einer View mit einem Button, habe ich noch nicht herausgefunden, wie ich nach Button Tap zu einer andere View wechsle.

    Wie würdet ihr das anstellen?
  • mit SwiftUI ist das doch simple

    du definierst dir eine @State var

    die sagt, ist loggen in oder nicht...

    wenn nicht zeige den Dialog an,
    ansonsten den loginDialog

    Sieht im Code so aus:

    Quellcode

    1. .sheed(isPresented: $isLoggedIn) {
    2. ... ruf auf deinen Passwortdialog
    3. }
    und da sagst du dann, gebe zwei Strings ein...
    prüfst... ob das korrekt ist..
    und wenn ja, dann weiter...

    das hat mit einer TabView erst mal gar nix zu tun...

    ach ja, zu deiner NavigationView,

    kannst ja noch sagen .isDisabled(!looggedIn)

    und gut ist's. Dann geht nix weiter
  • Danke, das ist nämlich auch meine Erfahrung das es nicht so einfach ist. Zumal die Logic das Sheet anzuzeigen wenn man eingeloggt ist, falsch wäre. Das sheet kommt solange man nicht eingeloggt ist. Aber das ist nur marginal und leicht zu ändern in dem man andere @State Variablen nimmt wie z.B. presentSheet[tt][/tt]

    stellt sich noch die Frage, auf was ich den .sheet(isPresented modifier abwenden soll, da ich ja keinen Button habe.
  • Deine Logik ist falsch!

    mit .sheet, führst du eine Aktion aus, z.B. du präsentierst deinen Login Bildschirm….
    … dazu übergibst ein Binding…, oder auch zwei

    das eine sagt, zeige mir den dialog an
    das andere sagt, ich bin angemeldet oder nicht…

    kannst aber ja auch in einen machen oder auch nicht


    wie du das binding beibringst, dass es nicht angemeldet ist, das kannst du machen wie du lustig bist…

    bspw. über einen button … welcher einfach nur den wert setzt, ich möcht den anmeldebildschirm jetzt sehen

    das ganze kannst auch aus den defaults, der datenbank, den netzwerk, per zufallsgenerator, oder was dir sonst noch einfällt sezten. Da ist deiner Fantasie keine Beschränkung auferlegt….
  • mit fehlt irgendwie gerade noch die ganze Logik, weil ich ja beim Tap auf das Tabviewitem eine Passwort abfragen haben will und wenn das Passwort richtig ist soll eine Tabelle angezeigt werden. Ja wäre lustig, wenn beim Tap auf das Tabviewitem eine sheet hoch käme mit der Passwort Abfrage, aber wo füge ich dann den .sheet modifiere hinzu und wie erkläre ich dem Sheet dann das die Tabelle angezeigt werden muss wenn das Passwort stimmt?

    wie kann ich denn in Swift Code einen SwiftUI View präsentieren?
  • Du präsentierst keinen Swift Code in SwiftUI, ausser du willst mit UIKit schaffen. SwiftUI ist für das präsentieren zuständig…

    mach dir doch einfach eine globale Variable ins Environment, die lautet isLoggedIn

    wenn die falsch ist, zeigst du den passwort dialog…
    … wenn die war ist, zeigst du den nicht…

    und dann kannst doch überall sagen

    if !isLoggedIn {
    DisplayLogDichMalEin() }
    else {
    ZeigWunderbareTabelle()
    }

    und wenn du das in eine Group verpackst…

    Group {
    }.sheet(isPresented: !($isLoggedIn)) {…

    kannst das doch wunderbar anzeigen
  • Warum soll das nicht gehen?

    Quellcode

    1. struct ContentView: View {
    2. @State private var v1: Bool = true
    3. var body: some View {
    4. Button {
    5. v1.toggle()
    6. } label: {
    7. if v1 {
    8. V1()
    9. } else {
    10. V2()
    11. }
    12. }
    13. }
    14. }
    15. struct V1: View {
    16. var body: some View {
    17. Text("V1 pressed")
    18. }
    19. }
    20. struct V2: View {
    21. var body: some View {
    22. Text("V2 pressed")
    23. }
    24. }
    Alles anzeigen
  • Wolf schrieb:

    Warum soll das nicht gehen?

    Quellcode

    1. struct ContentView: View {
    2. @State private var v1: Bool = true
    3. var body: some View {
    4. Button {
    5. v1.toggle()
    6. } label: {
    7. if v1 {
    8. V1()
    9. } else {
    10. V2()
    11. }
    12. }
    13. }
    14. }
    15. struct V1: View {
    16. var body: some View {
    17. Text("V1 pressed")
    18. }
    19. }
    20. struct V2: View {
    21. var body: some View {
    22. Text("V2 pressed")
    23. }
    24. }
    Alles anzeigen
    :S na klar, Ohmann. Ich hatte die Views in einzelnen Files, also die PasswortView und die ListenView....

    aber ich wollte eigentlich kein Button der das Login anzeigt, sondern prinzipiell beim Tap auf den Tabviewitem die Passwortabfrage
  • Du hast da wohl eher so was gemeint:

    Quellcode

    1. struct ContentView: View {
    2. @State private var v1: Bool = true
    3. var body: some View {
    4. Button {
    5. v1.toggle()
    6. } label: {
    7. V1()
    8. }.sheet(isPresented: $v1) {
    9. V2()
    10. }
    11. }
    12. }
    13. struct V1: View {
    14. var body: some View {
    15. Text("press for Dialog")
    16. }
    17. }
    18. struct V2: View {
    19. var body: some View {
    20. Text(" pressed")
    21. }
    22. }
    Alles anzeigen
    kannst ja auch in eigene Files verpacken…

    und das .sheet kannst fast überall dranhängen…
  • Ne, ich meine sowas und wie man sieht geht das wohl nicht:
    SwiftUI.png

    Quellcode

    1. import SwiftUI
    2. let lightGreyColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)
    3. struct passwordView: View {
    4. @State private var password:String = ""
    5. @State private var authenticationSuccess:Bool = false
    6. @State private var authenticationFailed:Bool = false
    7. @State private var loginCounter = 0
    8. var body: some View {
    9. SecureField("Sprich Freund und tritt ein", text: $password) {
    10. if password == "mellon" {
    11. authenticationSuccess = true
    12. loginCounter = 0
    13. personsView()
    14. } else {
    15. authenticationFailed = true
    16. loginCounter += 1
    17. if loginCounter >= 3 {
    18. //disable SecureField for 10 seconds
    19. }
    20. }
    21. }
    22. .padding(EdgeInsets(top: 20, leading: 15.0, bottom: 20, trailing: 5))
    23. .background(lightGreyColor)
    24. .cornerRadius(5.0)
    25. }
    26. struct passwordView_Previews: PreviewProvider {
    27. static var previews: some View {
    28. passwordView()
    29. }
    30. }
    31. }
    Alles anzeigen
  • Was soll personsView sein? Wenn das ein View zurück gibt, was macht das dann in der onCommit-Funktion?

    Möchtest Du statt dem SecureField() etwas anderes anzeigen, dann mach dort das if !isLoggedIn …. Das eine ist die normaler Swift-Code, das andere ist der SwiftUI-Part. Keine Ahnung, wie man das beschreiben soll.

    Das mit den vielen @State ist auch unnötig. Das brauchst Du nur dort, wo SwiftUI darauf regieren soll (einfach ausgedrückt).
  • Klassen und Strukturen würde ich mit einem Großbuchstaben beginnen, das ist quasi Standard.

    Wie gesagt, die onCommit-Closure verwendet man, um z.B. das Passwort zu überprüfen. Hier beschreibst Du keine GUI. Aber! Du kannst hier z.B. isLoggedIn auf wahr setzen, wenn die Eingabe des Passwortes richtig war. Im SwiftUI-Part kannst Du dieses isLoggedIn verwenden, um die View umzuschalten, oder auch ein Sheet nicht mehr anzuzeigen.