Я пробую 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")
}
}