I'm trying to animate the deletion of an item when swiping left in a list but it's not working. I'm using Realm to save the tasks. The deletion is applied immediately without animation even though the action is wrapped inside withAnimation.
I noticed that when i use the onDelete modifier the animation is playing well but there is no animation with swipeAction
import SwiftUI
import RealmSwift
struct TasksView: View {
@StateObject var tasksViewModel: TasksViewModel = TasksViewModel()
var body: some View {
List {
if let tasks = tasksViewModel.tasks {
ForEach(tasks.freeze(), id: \.id) { task in
Text(task.title)
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
Button(role: .destructive) {
withAnimation {
if let taskToDelete = task.thaw() {
tasksViewModel.archive(taskToDelete)
}
}
} label: {
Image("delete")
}
.tint(.red)
}
}
}
}
}
}
struct TasksViewNew_Previews: PreviewProvider {
static var previews: some View {
TasksView()
}
}
import Foundation
import RealmSwift
@MainActor
class TasksViewModel: ObservableObject {
@Published var tasks: List<Task>?
var token: NotificationToken?
init() {
let realm = try! Realm()
let group = Group()
do {
try realm.write {
let tasks = [Task(title: "TaskA"),
Task(title: "TaskB"),
Task(title: "TaskC"),
Task(title: "TaskD"),]
realm.add(group)
group.tasks.append(objectsIn: tasks)
self.tasks = group.tasks
}
} catch {
print("error")
}
token = group.observe({ (changes) in
switch changes {
case .error(_):
break
case .change(_, _):
self.objectWillChange.send()
break
case .deleted:
break
}
})
}
func archive(_ task: Task) {
do {
let realm = try Realm()
try realm.write {
realm.delete(task)
}
} catch {
print(error)
}
}
}
class Task: Object {
@Persisted var id: String = UUID().uuidString
@Persisted var title: String
convenience init(title: String) {
self.init()
self.title = title
}
}
class Group: Object, ObjectKeyIdentifiable {
@Persisted var _id = ObjectId.generate()
@Persisted var tasks = List<Task>()
}
