转换不适用于嵌套在带有 Core Data 数据的 List 中的 ForEach

XYZ*_*XYZ 5 core-data ios ios-animations swiftui

为什么起这个标题?

因为ListForEachCoreData是我认为的三个主要罪魁祸首......好吧,如果不只是.transition()它本身的话。

我想要的是

基本上,我想要一个存储在核心数据中的任务列表,并且在点击任务时,它就会随着.transition(.scale). 我尝试过的几种潜在解决方案在画布和模拟器中都失败了,其中两个是堆栈溢出:

  1. 添加视图时,SwiftUI 插入转换不起作用
  2. 过渡动画在 SwiftUI 中不起作用

其余的尝试只是将 插入.transition(.scale)到所有可能的位置,并且有/没有.animation(...)附加。


代码概述

这是我的错误视图的基本结构:

struct DeadlineListView: View {
    @FetchRequest(entity: Deadline.entity(),
                  sortDescriptors: [NSSortDescriptor(keyPath: \Deadline.dueTime, ascending: true)],
                  predicate: NSPredicate(format: "isCompleted == false"),
                  animation: Animation.linear(duration: 2)
    ) var deadlineList: FetchedResults<Deadline>
    
    // some other vars...
    
    var body: some View {
        VStack(spacing: 0.0) {
            HStack {
                // some other views...
            }
            
            // --- Where things matter most ---
            List {
                ForEach(deadlineList, id: \.uid) { deadline in
                    Button(action: { isShowingDeadlineDetails = true }) {
                        DeadlineView(deadline: deadline)
                    }.sheet(isPresented: $isShowingDeadlineDetails) {
                        DeadlineDetailView(deadline: deadline)
                    }
                    .listRowInsets(EdgeInsets())
                }
            }
            // --- Where things matter most ---
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以从技术上讲,我有一个 s 列表Button,看起来像DeadlineView(...).

DeadlineView(...)有一个按钮供用户点击以表示任务已完成:

Button(action: {
    deadline.isCompleted = true
    deadline.objectWillChange.send()

    do {
        try context.save()
    } catch {
        print("Unable to save deadline isCompleted in DeadlineView!")
    }
}){
    // some View...
}
Run Code Online (Sandbox Code Playgroud)

此按钮将使NSPredicate忽略此任务,从而使该任务从我的列表中消失。


我实际得到的

是的,它确实可以制作动画。但是已完成的任务被它下面的任务挤压,没有任何可见的(至少对我来说).transition(.scale)


我放置的地方.transition(.scale)

回到第一个片段:

            List {
                ForEach(deadlineList, id: \.uid) { deadline in
                    Button(action: { isShowingDeadlineDetails = true }) {
                        DeadlineView(deadline: deadline)
                        // .transition(.scale) 1. HERE!
                    }
                    // 2. HERE!
                    .sheet(isPresented: $isShowingDeadlineDetails) {
                        DeadlineDetailView(deadline: deadline)
                    }
                    // 3. HERE!
                    .listRowInsets(EdgeInsets())
                    // 4. HERE!
                }
                // 5. HERE!
            }
            // 6. HERE!
Run Code Online (Sandbox Code Playgroud)

后面全部有/没有 .animation(.linear(duration: 2)) 附加。


这只是另一个小发现

正如您可能已经注意到的,duration动画 ( 2) 的 相当长,因此它的运行速度足够慢,足以让我观察到它transition确实没有运行。

但有趣的是,它并没有对此做出反应duration,无论是它0.2还是2(好吧,至少对我来说,它似乎不会持续几2秒钟)。


欢迎任何解决方案或解决方法。

Yod*_*ama 0

由于过渡影响了这里的许多观点。您必须在内部进行与转换相关的更改

withAnimation(Animation.easeIn) { //here you can change the animation you want
               //state changes should write here
            }
Run Code Online (Sandbox Code Playgroud)

此链接可能有帮助 https://www.youtube.com/watch?v=3krC2c56ceQ