Hi, I am currently working through a SwiftUI tutorial where I am adding words entered into a text field to be displayed in a list beneath it. While doing so, I noticed that when trying to animate the insertion of the word into the text field, it wasn't working.
private func addNewWord(){
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
guard answer.count > 0, !usedWords.contains(answer) else {return}
newWord = ""
withAnimation {
usedWords.insert(answer, at: 0)
}
}
But, when I switched around those last 2 statements, the following code works properly:
private func addNewWord(){
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
guard answer.count > 0, !usedWords.contains(answer) else {return}
withAnimation {
usedWords.insert(answer, at: 0)
}
newWord = ""
}
Does anyone know why this is ? Is there something that has to do with the withAnimation call not being the final part in the function call ? Does it have to do with altering different State variables before or after the withAnimation call ? Is this expected behavior or some type of bug?
Please let me know, here is the entire SwiftUI Struct in case you want to run this and see for yourselves. Thank you
(Currently using xcode 15.0 on OS Sonoma 14.3.1)
struct ContentView: View {
@State private var newWord : String = ""
@State private var usedWords : [String] = [String]()
@State private var rootWord : String = ""
var body: some View {
NavigationStack {
List {
Section {
TextField("Enter your word", text: $newWord).textInputAutocapitalization(.never)
}
Section{
ForEach(usedWords, id: \.self){ word in
HStack {
Image(systemName: "\(word.count).circle")
Text(word)
}
}
}
}
.navigationTitle(rootWord)
}
.padding()
.onSubmit() {
addNewWord()
}
}
private func addNewWord(){
let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
guard answer.count > 0, !usedWords.contains(answer) else {return}
// newWord = ""
withAnimation {
usedWords.insert(answer, at: 0)
}
newWord = ""
}
}