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
//