UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Problem with input variable iOS 15.4

Forums > SwiftUI

Hello everyone,

since the update to iOS 15.4 the app no longer works properly. Would be glad if someone could help me.

Usually when I enter a number in the textfield (valueV), the result (valuevErgebnis) appears below. The problem is that despite entering the number, the variable is always empty/nil. Also, I can no longer set the value to empty afterwards.

Code:

import SwiftUI

//berechne:
class berechneRohrGeschwindigkeit: ObservableObject {

    //Volumenstrom Eingabe
    @Published var valueV:Double? {
        didSet {
            update()
        }
    }

    @Published var valueDN:Int = 80 {
        didSet {
            update()
        }
    }

    //Konstante
    let valuePI: Double = 3.141592653589

    //Ergebnis anzeigen wenn Eingabe richtig bzw. vollständig
    @Published var valueHiddenErgebnis = true
    //Ergebnis
    @Published var valuevErgebnis:Double = 0.0

    private func update() {

        //Ergebnis vor Prüfung ausblenden
        valueHiddenErgebnis = true
        valuevErgebnis = 0.0

        if valueV == nil {
        } else if valueV == 0 {
        } else {
            //wenn eingabe OK Ergebnis anzeigen
            valueHiddenErgebnis = false

            valuevErgebnis = ((valueV ?? 0) * 4) / (valuePI * pow((Double(valueDN)/1000), 2) * 3600)

        }

    }
}//class ENDE

import SwiftUI

//
// View START
//
struct RohrGeschwindigkeitView: View {

    //Wird nur benötigt, damit die Eingabe in v erkannt wird, und das Ergebnis bei richtiger Eingabe funktioniert
    @ObservedObject var berechneRohrv = berechneRohrGeschwindigkeit()

    //Datenbank
    @ObservedObject var DatenDN = DatenbankDN()

    //Ergebnis anzeigen wenn Eingabe richtig bzw. vollständig
    @State var valueHiddenErgebnis = true

    //Zeige Papierkorb oder OK. (mit OK wird Tastatur ausgeblendet).
    @State private var zeigePapierkorb: Bool = true
    @State private var closeKeyboard: Bool = false

    //Übergeordnet einfacher ändern:
    //Textabstände
    @State private var valueAbstandSymbol:CGFloat = 14 //außer Temperatureingabe
    @State private var valueAbstandEinheitBruchEingabe:CGFloat = 20
    @State private var valueAbstandEinheitBruchErgebnis:CGFloat = 20
    //Schriftgröße Bruch oder Zusatz Symbol /Einheit z.B. "VL" "Ist"
    @State private var valueSchriftKlein:CGFloat = 13.5
    //Ergebnis Abstand (spacing) unter den Texten (HStack)
    @State private var valueAbstandHStackSpacingErgebnis:CGFloat = 2
    //Abstand für Zahlen neber Picker & Slider z.B. Dichte, c, ...
    @State private var valueAbstandSliderZahl:CGFloat = 35

    //Damit in Textfeld Zahlen geschrieben werden können
    let formatter: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal//.none oder .decimal
        return formatter
    }()

    var body: some View {

        Form{

            Section (header: Text("Rohr - Strömungsgeschwindigkeit")){

                HStack {

                    Text("V")
                        .frame(width: valueAbstandSymbol, alignment: .leading) //Abstand Links + Linksbündig

                    TextField("Volumenstrom", value: $berechneRohrv.valueV, formatter: formatter, onEditingChanged: { (editingChanged) in
                        if editingChanged {
                            zeigePapierkorb = false
                            closeKeyboard = true

                        } else {
                            zeigePapierkorb = true
                            closeKeyboard = false
                            hideKeyboard()
                        }
                    })//ab ", onEditingChanged" Zeige Papierkorb oder OK.
                        .keyboardType(.decimalPad)//Tastatur Zahlen mit Komma
                        .foregroundColor(.blue)
                    //Text in der Mitte
                        .multilineTextAlignment(.center)
                    //Beim clicken alles markieren START
                        .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidBeginEditingNotification)) { obj in
                            if let textField = obj.object as? UITextField {
                                textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
                            }
                        }//Beim clicken alles markieren ENDE

                    //Einheit als Bruch:
                    VStack(spacing:0){
                        Text("m³")
                            .font(.system(size: valueSchriftKlein))
                        Divider()
                        Text("h")
                            .font(.system(size: valueSchriftKlein))
                    }.frame(width: valueAbstandEinheitBruchEingabe, alignment: .trailing)

                }

                VStack{
                    Text("Lüftungsrohr auswählen")
                        .frame(alignment: .center)

                    Picker("mm", selection: $berechneRohrv.valueDN) {
                        ForEach(DatenDN.valueDNArray, id: \.self) {
                            Text(String($0))
                        }
                    }.pickerStyle(.wheel)
                    //.pickerStyle(SegmentedPickerStyle())
                    //ab .onChange. Wenn geändert wird, schließe Tastatur, und zeige Papierkorb.
                    .labelsHidden()
                    .frame(height: 90)//width: 250, 
                    .clipped()
                    //.contentShape(Rectangle())
                        .onChange(of: berechneRohrv.valueDN) { _ in
                            zeigePapierkorb = true
                            closeKeyboard = false
                            hideKeyboard()
                        }
                }

                //Papierkorb oder OK Button.
                //Wenn kein Textfeld aktiv, zeige Papierkorb (OK ist ausgeblendet).
                //Wenn Textfeld aktiv, zeige OK (Papierkorb ist ausgeblendet)
                //Wenn auf Button Papierkorn gedrückt wird, wird anzeige zurückgesetzt.
                HStack {

                    Spacer()

                    if zeigePapierkorb {
                        Button {
                            //Keyboard schließen:
                            hideKeyboard()

                            //Eingabe zurücksetzten:
                            berechneRohrv.valueV = nil
                            berechneRohrv.valueDN = 80

                        } label: {
                            Image(systemName: "trash")
                                .frame(maxWidth: .infinity)

                        }
                        .tint(.red)
                    }

                    if closeKeyboard {

                        Button {
                            hideKeyboard()

                            //closeKeyboard = false
                            //zeigePapierkorb = true
                        } label: {
                            Image(systemName: "checkmark.circle")
                                .frame(maxWidth: .infinity)
                        }
                        //.foregroundColor(.white)

                        //.buttonStyle(.bordered)

                        //.buttonStyle(.borderedProminent)
                        .tint(.green) //mint

                    }

                    Spacer()

                }//Zeile Papierkorb und OK ENDE

            }//Section Eingabe ENDE

            //Ergebnis zeigen wenn Eingabe richtig
            if !berechneRohrv.valueHiddenErgebnis {

                Section (header: Text("Rechnerisch ermittelt")){

                    HStack(spacing:valueAbstandHStackSpacingErgebnis){

                        Text("v = \(berechneRohrv.valuevErgebnis, specifier: "%.2f") ")
                            .bold()
                            .foregroundColor(.blue)
                        //Einheit als Bruch
                        VStack(spacing:0){
                            Text("m")
                                .font(.system(size: valueSchriftKlein))
                                .bold()
                                .foregroundColor(.blue)
                            Divider()
                            Text("s")
                                .font(.system(size: valueSchriftKlein))
                                .bold()
                                .foregroundColor(.blue)
                        }.frame(width: valueAbstandEinheitBruchErgebnis)

                    }.frame(maxWidth: .infinity, alignment: .center) //Text in der Mitte

                }//Section Ergebnis ENDE

            }//Ergebnis ENDE

        }//Form ENDE

    }//body ENDE

}
//
// View ENDE
//

1      

Hacking with Swift is sponsored by Essential Developer

SPONSORED Join a FREE crash course for mid/senior iOS devs who want to achieve an expert level of technical and practical skills – it’s the fast track to being a complete senior developer! Hurry up because it'll be available only until April 28th.

Click to save your free spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

Archived topic

This topic has been closed due to inactivity, so you can't reply. Please create a new topic if you need to.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.