Há uma lista com duas seções: opções escolhidas , que são reordenáveis e deletáveis, e opções sugeridas , que podem ser adicionadas às escolhidas. Como fazer novos itens serem arrastáveis e removíveis instantaneamente? A captura de tela mostra como fica, eu quero que "cinco" e "seis" sejam editáveis instantaneamente quando adicionados.
É muito estranho para mim que quando eu uso ForEach(suggested, id: \.self)
em vez de ForEach(filteredSuggestions(), id: \.self)
, a seção escolhida parece como esperado , mas a sugerida obviamente não.
struct EditorView: View {
@State var chosen = ["one", "two", "three", "four"]
let suggested = ["five", "six", "seven", "eight"]
var body: some View {
List {
Section {
ForEach(chosen, id: \.self) { item in Text(item) }
.onDelete{ _ in }
.onMove{ _, _ in }
} header: { Text("chosen") }
Section {
ForEach(filteredSuggestions(), id: \.self) { item in
HStack(spacing: 14) {
Button { chosen.append(item) }
label: {
Image(systemName: "plus.circle.fill")
.imageScale(.large)
.foregroundStyle(.green)
}
Text(item)
}
}
} header: { Text("suggested") }
}
.environment(\.editMode, .constant(.active))
}
private func filteredSuggestions() -> [String] {
return suggested.filter { item in
!chosen.contains(item)
}
}
}
Ao usar
filteredSuggestions()
noForEach
, ele é adicionado como se o EditMode estivesse desabilitado.Como
EditMode
vem do ambiente, quando você usa o array filtrado (filteredSuggestions()
) no ForEach, a lista filtrada pode ser recalculada toda vez que a exibição é atualizada, causando um comportamento inesperado, possivelmente em relação ao momento em que a lista é atualizada e quandoEditMode
é aplicada à primeira seção.Por outro lado, quando você usa a lista sugerida diretamente ( sem filtragem), funciona porque os dados não mudam dinamicamente, e o ForEach pode facilmente manter o estado esperado da lista.
A solução é manter as sugestões filtradas em um estado e controlar quando a filtragem acontece de forma compatível com SwiftUI.
Então crie um
filtered
estado que seja inicialmente uma matriz vazia, preencha-o com a saída dafilteredSuggestions()
função on appear e use.onChange
o modificador para atualizar o estado sempre que o conteúdochosen
mudar:Aqui está o código completo:
Observação: depois de adicionar uma sugestão, tente removê-la da lista escolhida; ela deverá reaparecer como uma sugestão.