我有一個可以以編程方式修改的文本欄位。它作業正常,直到有條件地顯示表單部分,在這種情況下,當我使用文本欄位時應用程式會凍結。
這是我的代碼(我洗掉了不必要的東西):
struct test: View {
@Environment(\.presentationMode) var presentationMode
@State private var displaySection = true
@State private var amount: Double?
@FocusState private var isFocused: Bool
var body: some View {
NavigationView{
Form {
if displaySection { // <-- works well without that condition, otherwise app freezes
Section {
VStack {
HStack {
Text("Amount EUR")
Spacer()
TextField("Type amount", value: $amount, format: .number)
.keyboardType(.numberPad)
.multilineTextAlignment(.trailing)
.focused($isFocused)
}
Text("Set MAX (999)")
.frame(maxWidth: .infinity, alignment: .leading)
.onTapGesture {
isFocused = false
amount = 999
}
}
}
}
}
}
}
}
我需要在表格中隱藏一些部分,所以我堅持這一點,沒有成功繞過這個問題。問題出現在模擬器上以及設備上。
這種行為是正常的,還是有可能的解決方法?謝謝你的幫助 :)
uj5u.com熱心網友回復:
因此,使用 Intel 和 iOS 15.2 上的 Xcode 13.2.1,如果我在“Amount EUR”中輸入超過三位數的數字,然后嘗試“將最大值設定為 999”,即三位數。
在以前版本的 SwiftUI 中,唯一可以使用的輸入系結 TextField 是 String。似乎雖然當前版本接受系結到數字的方式是映射,但底層機制仍然是基于原始字串的 TextField 的機制(不幸的是,在帶有附加鍵盤的 TextField 中鍵入仍然會呈現非數字字符不管鍵盤型別如何,就像我上次嘗試時所做的那樣 https://gist.github.com/shufflingB/23daafa5253c3355cdf18934599cd54c)
無論出于何種原因,當輸入超過三個數字時,這個新的(ish)映射程序似乎會變得混亂,然后默認情況下 TextField 會自動添加一個數字分組字符。
兩種變通方法似乎可以解決該問題:
amount使用_Set the Max ..._DispatchQueue.main.asyncAfter提供一個選項以從 TextField 中洗掉麻煩的分組字符。
struct ContentView: View {
@Environment(\.presentationMode) var presentationMode
@State private var displaySection = true
@State private var amount: Double?
@FocusState private var isFocused: Bool
var body: some View {
NavigationView {
Form {
if displaySection {
Section {
VStack {
HStack {
Text("Amount EUR")
Spacer()
TextField("Type amount", value: $amount, format: .number)
.keyboardType(.numberPad)
.multilineTextAlignment(.trailing)
.focused($isFocused)
/* Alternative to Dispatch, remove number grouping
TextField("Type amount", value: $amount, format: .number.grouping(.never))
.keyboardType(.numberPad)
.multilineTextAlignment(.trailing)
.focused($isFocused)
*/
}
Text("Set MAX (999)")
.frame(maxWidth: .infinity, alignment: .leading)
.onTapGesture {
isFocused = false
DispatchQueue.main.asyncAfter(deadline: .now() 0.1) { // <- Push change to subsequent update cycle
amount = 999
}
}
}
}
}
}
}
}
}
uj5u.com熱心網友回復:
分而治之。
你在你的應用程式中提出了一個非常奇怪的行為,我永遠不會想象這樣的錯誤。我測驗了你的代碼,它實際上凍結了應用程式。
現在,我測驗了下面的解決方案:將您移動Section到單獨的視圖。在我的 Xcode 中,它可以作業。
struct Example: View {
@Environment(\.presentationMode) var presentationMode
@State private var displaySection = true
var body: some View {
NavigationView{
Form {
if displaySection { // <-- works well ALSO WITH that condition
ConditionalSection()
}
Button {
withAnimation {
displaySection.toggle()
}
} label: {
Text("Display or not display?")
}
}
}
}
}
struct ConditionalSection: View {
@State private var amount: Double?
@FocusState private var isFocused: Bool
var body: some View {
Section {
VStack {
HStack {
Text("Amount EUR")
Spacer()
TextField("Type amount", value: $amount, format: .number)
.keyboardType(.numberPad)
.multilineTextAlignment(.trailing)
.focused($isFocused)
}
Text("Set MAX (999)")
.frame(maxWidth: .infinity, alignment: .leading)
.onTapGesture {
isFocused = false
amount = 999
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/437738.html
上一篇:角度反應形式重置
