Реализация функции отклонения клавиатуры как расширения представления, а затем вызов моего представления. Кажется, это работает не слишком хорошо. Кажется, что вам нужно щелкнуть в очень определенных местах, чтобы отключить клавиатуру, и я имею в виду странные места (в правом верхнем углу экрана или чуть выше текстового поля, НО не отклонит его прямо рядом или под текстовым полем) . Кажется, это не относится ко всему 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
Отключить клавиатуру, не вызывающую весь VStack ⇐ IOS
Программируем под IOS
-
Anonymous
1713239565
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()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78331720/dismiss-keyboard-not-calling-on-entire-vstack[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия