Отключить клавиатуру, не вызывающую весь VStackIOS

Программируем под IOS
Ответить
Anonymous
 Отключить клавиатуру, не вызывающую весь VStack

Сообщение Anonymous »

Реализация функции отклонения клавиатуры как расширения представления, а затем вызов моего представления. Кажется, это работает не слишком хорошо. Кажется, что вам нужно щелкнуть в очень определенных местах, чтобы отключить клавиатуру, и я имею в виду странные места (в правом верхнем углу экрана или чуть выше текстового поля, НО не отклонит его прямо рядом или под текстовым полем) . Кажется, это не относится ко всему VStack? Я не уверен.
Вот мой код:
Отключить функцию клавиатуры:
extension View {
func dismissKeyboardForView() {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}

//
// Pressure&DensityView.swift
// FlightBuddyApp
//
// Created by Yehuda Lelah on 4/12/24.
//

import SwiftUI

struct Pressure_DensityView: View {
@EnvironmentObject private var model: SharedData
@EnvironmentObject private var modelToPass: SharedData

// var formatter = NumberFormatter() // For formatting result strings

@State var altimSet = "3"
@State var elev = "3"

@State var altimSetPlaceholder = "Current Altimiter Setting"
@State var elevPlaceholder = "Field Elevation"

@State var oatSet = "3"
@State var isaSet = "3"

@State var oatSetPlaceholder = "Current OAT"
@State var isaSetPlaceholder = "ISA"

// pa & da
@State var pressurealtitude = 0
@State var densityaltitude = 0

var anyOfMultiple: [String] {[
altimSet, elev, oatSet, isaSet
]}

var body: some View {
VStack(alignment: .center) {

VStack {
Text("Pressure Altitude: \(pressurealtitude)")
Text("Density Alitude: \(densityaltitude)")
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 100)
.font(.title3)
.foregroundStyle(.blue)
.multilineTextAlignment(.center)

// Stack to handle Altim and FE
VStack {
TextField(altimSetPlaceholder, text: $altimSet)
Divider()
TextField(elevPlaceholder, text: $elev)

Divider()

TextField(oatSetPlaceholder, text: $oatSet) // oat
Divider()
TextField(isaSetPlaceholder, text: $isaSet) // isa
}
.font(.title2)
.fontDesign(.monospaced)
.multilineTextAlignment(.center)
.padding()

.task {
if !model.airportName.isEmpty { // if not empty...

// .. set placeholder text of texfield to current from json pull
altimSetPlaceholder = String(model.airportAltimSetting)
elevPlaceholder = String(model.airportFieldElev)
oatSetPlaceholder = String(model.airportTemp)

print("json field \(model.airportFieldElev)")
}
}
.onChange(of: anyOfMultiple) {
// disabledButtonDueToEmptyTextFields()
}

Button {
guard model.airportAltimSetting.description.isEmpty == false else { return }
guard model.airportFieldElev.description.isEmpty == false else { return }

if (altimSet != "" && elev != "") {
// calc pa
pressurealtitude = pressureAltitude((altimSet as NSString).doubleValue, (elev as NSString).integerValue)
} else {
// calc pa
pressurealtitude = pressureAltitude(model.airportAltimSetting, model.airportFieldElev)
}

// calc for isa
let isa = calculateISA(pressurealtitude)
isaSet = String(isa)

if (oatSet != "") {
// calc da
densityaltitude = densityAltitude((oatSet as NSString).integerValue, isa, pressureAltitude: pressurealtitude)
} else {
// calc da
densityaltitude = densityAltitude(Int(model.airportTemp), isa, pressureAltitude: pressurealtitude)
}

/// Pass calculated airport press & dens altitudes
modelToPass.airportPressureAltitude = pressurealtitude
modelToPass.airportDensityAltitude = densityaltitude

} label: {
Text("Calculate")
}
.buttonStyle(CalculateButton())
}
.onAppear() {

disabledButtonDueToEmptyTextFields() // will change color of button if any textfields are empty that are required for the calculations
}
.onTapGesture {
self.dismissKeyboardForView()
}
.toolbar {
Button {
Task {
// reset / reload
resetPADAValues()
disabledButtonDueToEmptyTextFields()
}
} label: { Image(systemName: "arrow.clockwise")}
.buttonStyle(ResetFieldsForCalculateButton())

Spacer()
Spacer()
}
}

/// Pressure Altitude
func pressureAltitude(_ currentAltimSetting: Double, _ fieldElevation: Int) -> Int {
/** PA = [(29.92 - current) * 1000] + FE **/
print("current altim: \(currentAltimSetting)")
print("current field: \(fieldElevation)")
let pa = ((29.92 - currentAltimSetting) * 1000) + Double(fieldElevation)
let paInt = Int(pa)
return paInt
}

/// Density Altitude
func densityAltitude(_ oat: Int, _ isa: Int, pressureAltitude: Int) -> Int {
/** DA = [(OAT - ISA) * 120] + PA **/
let da = ((oat - isa) * 120) + pressureAltitude
let daInt = Int(da)
return daInt
}

/// ISA Calc
/// automatically calcs current isa based on airport pressure altitude
func calculateISA(_ pressureAltitude: Int) -> Int {
var startAlt: Int = 1000
var isa: Int = 0
var isaMath: Int = 15

for _ in 1...10 {
if pressureAltitude < startAlt {
isa = isaMath
if (startAlt - pressureAltitude) < 300 {
isa -= 2
}
} else {
startAlt += 1000
isaMath -= 2
}
}

return isa
}

func resetPADAValues() {
altimSet = ""
elev = ""
oatSet = ""
isaSet = ""
pressurealtitude = 0
densityaltitude = 0
}

func disabledButtonDueToEmptyTextFields() {
model.areTFEmpty = true // reset
if (altimSet.isEmpty || elev.isEmpty || oatSet.isEmpty || isaSet.isEmpty && (arePlaceholdersEmpty() == true)) {
modelToPass.areTFEmpty = true
} else {
modelToPass.areTFEmpty = false
}
}

func arePlaceholdersEmpty() -> Bool {
/*
are they empty?
yes: true
no: false
*/
var isTrue = Bool()
if ( (altimSetPlaceholder != "Current Altimiter Setting" || altimSetPlaceholder != "")
|| (elevPlaceholder != "Field Elevation" || elevPlaceholder != "")
|| (oatSetPlaceholder != "Current OAT" || oatSetPlaceholder != "")
|| (isaSetPlaceholder != "ISA" || isaSetPlaceholder != "") ) {
print("there are values for everything")
isTrue = false
} else {
print("there are no values")
print("placeholder: \(elevPlaceholder)")
isTrue = true
}

return isTrue
}

}

#Preview {
Pressure_DensityView()
}



Подробнее здесь: https://stackoverflow.com/questions/783 ... ire-vstack
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»