SwiftUI onTapGesture не выполняет правильно мой код - PullRequest
0 голосов
/ 05 февраля 2020

Я пробую if else внутри «onTapGesture», но не работает правильно. Но закрыть KeyBoard работает очень хорошо, когда я постучал снаружи. Выполнять только блок if else в .onTapGesture тоже не получится. Есть идеи, почему if else не работает в .onTapGesture?

struct OnboardingWeight {
        static let _title = "Super! Wie ist dein aktuelles Gewicht?"
        static let _headline = "Dein Gewicht wird mir helfen dir genauere Auswertungen zu liefern."
        static let _textField = "Gewicht"
        static let _buttonText = "Weiter"
    }
import SwiftUI

struct Metadata {

    struct OnboardingNavigationTitle {
        static let _titleNameView = "Frage 1 von 6"
        static let _titleWeightView = "Frage 3 von 6"
        static let _titleAgeView = "Frage 2 von 6"
        static let _titleHeightView = "Frage 4 von 6"
        static let _titleActivityView = "Frage 5 von 6"
        static let _titleGenderView = "Frage 6 von 6"
        static let _titleResumeView = "Abschluss"
    }
import SwiftUI

struct OnboardingWeightView: View {
    //MARK: - Properties
    @ObservedObject var userData = UserData()
    @State private var userWeight : String = ""
    @State private var showEmptyAlert : Bool = false
    @State private var showNonCorrectAlert : Bool = false
    @State private var isStringADouble : Bool = false

    var body: some View {

        VStack(alignment: .center, spacing: 0) {
            //MARK: - Title
            Text(Metadata.OnboardingWeight._title)
                .font(.system(.largeTitle, design: .rounded))
                .font(.system(.largeTitle, design: .rounded))
                .multilineTextAlignment(.center)
                .padding()
            //MARK: - Headline
            Text(Metadata.OnboardingWeight._headline)
                .font(.system(.headline, design: .rounded))
            Spacer()
            //MARK: - TextFieldWeight
            TextField(Metadata.OnboardingWeight._textField, text: $userWeight){
                UserDefaults.standard.set(self.userWeight, forKey: "weight")
            }
            .font(.system(.body , design: .rounded))
            .multilineTextAlignment(.center)
            .font(.headline)
            .frame(maxWidth: .infinity)
            .frame(height: 50, alignment: .center)
            .background(
                RoundedRectangle(cornerRadius: 16)
                    .foregroundColor(Color(red: 0.0, green: 0.0, blue: 0.0, opacity: 0.0))
                    .background(RoundedRectangle(cornerRadius: 8)
                        .stroke(Color("ColorLightGreen"), lineWidth: 3)))
                .foregroundColor(Color.primary)
                .padding(.horizontal, 50)
                .keyboardType(.decimalPad)
            Spacer()
            //MARK: - NavigationLinkButton
            NavigationLink(destination: OnboardingHeightView()){
                Text("Weiter")
                    .font(.headline)
                    .frame(height: 50)
                    .frame(maxWidth: .infinity)
                    .background(Color("ColorLightGreen"))
                    .foregroundColor(Color.black)
                    .cornerRadius(16)
                    .font(.system(.body , design: .rounded))
                    .padding()
            }
            .disabled((userWeight.isEmpty) || (!isStringADouble))
            .onTapGesture {

                if self.userWeight.isEmpty {
                    self.showEmptyAlert.toggle()
                }else if !self.isStringADouble {
                    self.showNonCorrectAlert.toggle()
                }

            }
        }

************** Here is my Problem **************
        .onTapGesture {
            //            UserDefaults.standard.set(self.userWeight, forKey: "weight")
            let keyWindow = UIApplication.shared.connectedScenes
                .filter({$0.activationState == .foregroundActive})
                .map({$0 as? UIWindowScene})
                .compactMap({$0})
                .first?.windows
                .filter({$0.isKeyWindow}).first
            keyWindow!.endEditing(true)

            if let userWeightIsNumber = Double(self.userWeight) {
                print("User Weight is a Number \(userWeightIsNumber)")
                self.isStringADouble.toggle()
            }else{
                print("User weight not correct")
            }
        }
        .navigationBarTitle(Metadata.OnboardingNavigationTitle._titleWeightView)
        .navigationBarBackButtonHidden(true)

        .alert(isPresented: $showEmptyAlert){
            Alert(title: Text("Fehler"), message: Text("Bitte gebe deinen Gewicht ein!"), dismissButton: .default(Text("Ok")))
        }
        .alert(isPresented: $showNonCorrectAlert){
            Alert(title: Text("Toller Versuch"), message: Text("Dein Gewicht wurde nicht korrekt eingegeben!"), dismissButton: .default(Text("Ok")))
        }
    }


}

struct OnboardingWeightView_Previews: PreviewProvider {
    static var previews: some View {
        OnboardingWeightView()
            .previewDevice("iPhone SE")
    }
}

...