【发布时间】:2021-09-26 15:56:11
【问题描述】:
我正在尝试在列表中向左滑动时为删除项目设置动画,但它不起作用。我正在使用 Realm 来保存任务。即使操作包含在 withAnimation 中,也会立即应用删除而不使用动画。
我注意到,当我使用 onDelete 修饰符时,动画播放良好,但没有使用 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>()
}
【问题讨论】:
-
几点建议;您可以通过在列表中使用
@ObservedRealmObject属性包装器来简化代码。这会根据需要自动打开写入事务。此外,尚不清楚为什么这些物体会被冻结。也可能将.onDelete(perform:添加到列表项也可以简化代码。 -
任何运气/进展?看来我遇到了同样的问题,用一个简单的
Array或Strings 作为我的模型。所以我怀疑动画问题与Realm(?)有关。