Tenho uma lista simples dentro de uma pilha de navegação. Coloquei um botão na parte inferior da lista para adicionar um item ao array que a preenche.
O botão aciona um alerta com um campo de texto para fornecer o nome do novo item.
Isso funciona perfeitamente no meu iPad, em prévias usando iPad e iPhone, e no Simulador também usando iPad e iPhone.
No entanto, o TextField de alguma forma não funciona corretamente no meu iPhone (com o sistema operacional 18.5 — talvez seja esse o problema? Embora eu também esteja usando o 18.5 no iPad).
Não funciona assim: quando clico no botão "+ ingrediente", o alerta aparece corretamente. Consigo inserir texto nele. Mas depois de clicar no botão "Adicionar" na caixa de diálogo de alerta, o fechamento não é executado (coloco pontos de interrupção dentro do fechamento, e eles nunca são alcançados).
Agradecemos antecipadamente por quaisquer ideias.
(Se eu remover o TextField e colocar o botão Adicionar dentro do alerta, basta adicionar um ingrediente à matriz, isso funciona bem.)
Aqui está o código
import SwiftUI
struct IngredientsEditView: View {
@AppStorage("ingredients") var ingredients = starterIngredients
@AppStorage("ingredientsDone") var ingredientsDone: Bool = false
@State private var addingIngredient = false
@State private var newIngredient = ""
var body: some View {
NavigationStack {
List {
Section {
ForEach ($ingredients, id: \.self, editActions: .all) { $ingredient in
Text(ingredient)
}
.onDelete(perform: delete)
.onMove(perform: move)
}
Button("+ ingredient") {
addingIngredient.toggle()
}
.alert("New Ingredient", isPresented: $addingIngredient) {
TextField("Ingredient", text: $newIngredient)
Button("Cancel", role: .cancel) {
newIngredient = ""
}
Button("Add") {
if !newIngredient.isEmpty {
ingredients.append(newIngredient)
newIngredient = ""
}
}
}
}
.navigationTitle("Ingredients")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
ToolbarItem(placement: .navigationBarLeading) {
Button("Start Ordering!") {
ingredientsDone = true
}
}
}
}
}
func delete(indexSet: IndexSet) {
ingredients.remove(atOffsets: indexSet)
}
func move(from source: IndexSet, to destination: Int) {
ingredients.move(fromOffsets: source, toOffset: destination)
}
}
#Preview {
IngredientsEditView()
}
Mova o
.alert(...)
lado de foraList
ou mesmo para fora doNavigationStack
.Observe também o comentário de não usar
id: \.self
emForEach
. Da mesma forma,@AppStorage
não é o armazenamento apropriado para uma matriz deingredients